From 9fe66e8b769e6fe1c66b8d00b6c8e6403d9d6303 Mon Sep 17 00:00:00 2001 From: Konstantin Tokarev Date: Tue, 10 Sep 2013 10:57:29 +0200 Subject: [PATCH 5/9] Port of r118587 to TextBreakIteratorQt.cpp. --- .../WebCore/platform/text/qt/TextBreakIteratorQt.cpp | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/Source/WebCore/platform/text/qt/TextBreakIteratorQt.cpp b/Source/WebCore/platform/text/qt/TextBreakIteratorQt.cpp index 0d9d48d..96436a7 100644 --- a/Source/WebCore/platform/text/qt/TextBreakIteratorQt.cpp +++ b/Source/WebCore/platform/text/qt/TextBreakIteratorQt.cpp @@ -25,6 +25,7 @@ #include #include #include +#include // #define DEBUG_TEXT_ITERATORS #ifdef DEBUG_TEXT_ITERATORS @@ -70,10 +71,24 @@ namespace WebCore { static TextBreakIterator* nonSharedCharacterBreakIterator; + static inline bool compareAndSwapNonSharedCharacterBreakIterator(TextBreakIterator* expected, TextBreakIterator* newValue) + { +#if ENABLE(COMPARE_AND_SWAP) + return weakCompareAndSwap(reinterpret_cast(&nonSharedCharacterBreakIterator), expected, newValue); +#else + DEFINE_STATIC_LOCAL(Mutex, nonSharedCharacterBreakIteratorMutex, ()); + MutexLocker locker(nonSharedCharacterBreakIteratorMutex); + if (nonSharedCharacterBreakIterator != expected) + return false; + nonSharedCharacterBreakIterator = newValue; + return true; +#endif + } + NonSharedCharacterBreakIterator::NonSharedCharacterBreakIterator(const UChar* buffer, int length) { m_iterator = nonSharedCharacterBreakIterator; - bool createdIterator = m_iterator && weakCompareAndSwap(reinterpret_cast(&nonSharedCharacterBreakIterator), m_iterator, 0); + bool createdIterator = m_iterator && compareAndSwapNonSharedCharacterBreakIterator(m_iterator, 0); if (!createdIterator) m_iterator = new TextBreakIterator(); if (!setUpIterator(*m_iterator, QTextBoundaryFinder::Grapheme, buffer, length)) { @@ -84,7 +99,7 @@ namespace WebCore { NonSharedCharacterBreakIterator::~NonSharedCharacterBreakIterator() { - if (!weakCompareAndSwap(reinterpret_cast(&nonSharedCharacterBreakIterator), 0, m_iterator)) + if (!compareAndSwapNonSharedCharacterBreakIterator(m_iterator, 0)) delete m_iterator; } -- 1.8.3.1