qtwebkit/0005-Port-of-r118587-to-Tex...

60 lines
2.4 KiB
Diff

From 9fe66e8b769e6fe1c66b8d00b6c8e6403d9d6303 Mon Sep 17 00:00:00 2001
From: Konstantin Tokarev <ktokarev@smartlabs.tv>
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 <algorithm>
#include <qdebug.h>
#include <wtf/Atomics.h>
+#include <wtf/ThreadingPrimitives.h>
// #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<void**>(&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<void**>(&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<void**>(&nonSharedCharacterBreakIterator), 0, m_iterator))
+ if (!compareAndSwapNonSharedCharacterBreakIterator(m_iterator, 0))
delete m_iterator;
}
--
1.8.3.1