| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2011 Apple Inc. All Rights Reserved. | 2 * Copyright (C) 2011 Apple Inc. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
| 6 * are met: | 6 * are met: |
| 7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
| 8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
| 9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
| 10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
| (...skipping 30 matching lines...) Expand all Loading... |
| 41 WTF_MAKE_NONCOPYABLE(LineBreakIteratorPool); | 41 WTF_MAKE_NONCOPYABLE(LineBreakIteratorPool); |
| 42 public: | 42 public: |
| 43 static LineBreakIteratorPool& sharedPool() | 43 static LineBreakIteratorPool& sharedPool() |
| 44 { | 44 { |
| 45 static WTF::ThreadSpecific<LineBreakIteratorPool>* pool = new WTF::Threa
dSpecific<LineBreakIteratorPool>; | 45 static WTF::ThreadSpecific<LineBreakIteratorPool>* pool = new WTF::Threa
dSpecific<LineBreakIteratorPool>; |
| 46 return **pool; | 46 return **pool; |
| 47 } | 47 } |
| 48 | 48 |
| 49 static PassOwnPtr<LineBreakIteratorPool> create() { return adoptPtr(new Line
BreakIteratorPool); } | 49 static PassOwnPtr<LineBreakIteratorPool> create() { return adoptPtr(new Line
BreakIteratorPool); } |
| 50 | 50 |
| 51 UBreakIterator* take(const AtomicString& locale) | 51 icu::BreakIterator* take(const AtomicString& locale) |
| 52 { | 52 { |
| 53 UBreakIterator* iterator = 0; | 53 icu::BreakIterator* iterator = 0; |
| 54 for (size_t i = 0; i < m_pool.size(); ++i) { | 54 for (size_t i = 0; i < m_pool.size(); ++i) { |
| 55 if (m_pool[i].first == locale) { | 55 if (m_pool[i].first == locale) { |
| 56 iterator = m_pool[i].second; | 56 iterator = m_pool[i].second; |
| 57 m_pool.remove(i); | 57 m_pool.remove(i); |
| 58 break; | 58 break; |
| 59 } | 59 } |
| 60 } | 60 } |
| 61 | 61 |
| 62 if (!iterator) { | 62 if (!iterator) { |
| 63 UErrorCode openStatus = U_ZERO_ERROR; | 63 UErrorCode openStatus = U_ZERO_ERROR; |
| 64 bool localeIsEmpty = locale.isEmpty(); | 64 bool localeIsEmpty = locale.isEmpty(); |
| 65 iterator = ubrk_open(UBRK_LINE, localeIsEmpty ? currentTextBreakLoca
leID() : locale.string().utf8().data(), 0, 0, &openStatus); | 65 iterator = icu::BreakIterator::createLineInstance(localeIsEmpty ? cu
rrentTextBreakLocaleID() : locale.string().utf8().data(), openStatus); |
| 66 // locale comes from a web page and it can be invalid, leading ICU | 66 // locale comes from a web page and it can be invalid, leading ICU |
| 67 // to fail, in which case we fall back to the default locale. | 67 // to fail, in which case we fall back to the default locale. |
| 68 if (!localeIsEmpty && U_FAILURE(openStatus)) { | 68 if (!localeIsEmpty && U_FAILURE(openStatus)) { |
| 69 openStatus = U_ZERO_ERROR; | 69 openStatus = U_ZERO_ERROR; |
| 70 iterator = ubrk_open(UBRK_LINE, currentTextBreakLocaleID(), 0, 0
, &openStatus); | 70 iterator = icu::BreakIterator::createLineInstance(currentTextBre
akLocaleID(), openStatus); |
| 71 } | 71 } |
| 72 | 72 |
| 73 if (U_FAILURE(openStatus)) { | 73 if (U_FAILURE(openStatus)) { |
| 74 LOG_ERROR("ubrk_open failed with status %d", openStatus); | 74 LOG_ERROR("BreakIterator construction failed with status %d", op
enStatus); |
| 75 return 0; | 75 return 0; |
| 76 } | 76 } |
| 77 } | 77 } |
| 78 | 78 |
| 79 ASSERT(!m_vendedIterators.contains(iterator)); | 79 ASSERT(!m_vendedIterators.contains(iterator)); |
| 80 m_vendedIterators.set(iterator, locale); | 80 m_vendedIterators.set(iterator, locale); |
| 81 return iterator; | 81 return iterator; |
| 82 } | 82 } |
| 83 | 83 |
| 84 void put(UBreakIterator* iterator) | 84 void put(icu::BreakIterator* iterator) |
| 85 { | 85 { |
| 86 ASSERT_ARG(iterator, m_vendedIterators.contains(iterator)); | 86 ASSERT_ARG(iterator, m_vendedIterators.contains(iterator)); |
| 87 | 87 |
| 88 if (m_pool.size() == capacity) { | 88 if (m_pool.size() == capacity) { |
| 89 ubrk_close(m_pool[0].second); | 89 delete m_pool[0].second; |
| 90 m_pool.remove(0); | 90 m_pool.remove(0); |
| 91 } | 91 } |
| 92 | 92 |
| 93 m_pool.append(Entry(m_vendedIterators.take(iterator), iterator)); | 93 m_pool.append(Entry(m_vendedIterators.take(iterator), iterator)); |
| 94 } | 94 } |
| 95 | 95 |
| 96 private: | 96 private: |
| 97 LineBreakIteratorPool() { } | 97 LineBreakIteratorPool() { } |
| 98 | 98 |
| 99 static const size_t capacity = 4; | 99 static const size_t capacity = 4; |
| 100 | 100 |
| 101 typedef pair<AtomicString, UBreakIterator*> Entry; | 101 typedef pair<AtomicString, icu::BreakIterator*> Entry; |
| 102 typedef Vector<Entry, capacity> Pool; | 102 typedef Vector<Entry, capacity> Pool; |
| 103 Pool m_pool; | 103 Pool m_pool; |
| 104 HashMap<UBreakIterator*, AtomicString> m_vendedIterators; | 104 HashMap<icu::BreakIterator*, AtomicString> m_vendedIterators; |
| 105 | 105 |
| 106 friend WTF::ThreadSpecific<LineBreakIteratorPool>::operator LineBreakIterato
rPool*(); | 106 friend WTF::ThreadSpecific<LineBreakIteratorPool>::operator LineBreakIterato
rPool*(); |
| 107 }; | 107 }; |
| 108 | 108 |
| 109 } | 109 } |
| 110 | 110 |
| 111 #endif | 111 #endif |
| OLD | NEW |