diff --git a/src/plugins/cpptools/stringtable.cpp b/src/plugins/cpptools/stringtable.cpp index 6d284536eeb85e634b69bc45c34636c6f2de5b76..9617430d4a2ced583ba15b4a4c4f86d2ba96bbd7 100644 --- a/src/plugins/cpptools/stringtable.cpp +++ b/src/plugins/cpptools/stringtable.cpp @@ -63,7 +63,7 @@ QString StringTable::insert(const QString &string) QMutexLocker locker(&m_lock); QString result = *m_strings.insert(string); - m_stopGCRequested.storeRelease(false); + m_stopGCRequested.fetchAndStoreRelease(false); return result; } @@ -83,15 +83,24 @@ enum { DebugStringTable = 0 }; +static inline int qstringRefCount(const QString &string) +{ +#if QT_VERSION >= 0x050000 + return const_cast<QString&>(string).data_ptr()->ref.atomic.load(); +#else + return const_cast<QString&>(string).data_ptr()->ref; +#endif +} + void StringTable::GC() { QMutexLocker locker(&m_lock); int initialSize = 0; - int startTime = 0; + QTime startTime; if (DebugStringTable) { initialSize = m_strings.size(); - startTime = QTime::currentTime().msecsSinceStartOfDay(); + startTime = QTime::currentTime(); } // Collect all QStrings which have refcount 1. (One reference in m_strings and nowhere else.) @@ -99,18 +108,16 @@ void StringTable::GC() if (m_stopGCRequested.testAndSetRelease(true, false)) return; - const int refCount = const_cast<QString&>(*i).data_ptr()->ref.atomic.load(); - if (refCount == 1) + if (qstringRefCount(*i) == 1) i = m_strings.erase(i); else ++i; } if (DebugStringTable) { - const int endTime = QTime::currentTime().msecsSinceStartOfDay(); const int currentSize = m_strings.size(); qDebug() << "StringTable::GC removed" << initialSize - currentSize - << "strings in" << endTime - startTime + << "strings in" << startTime.msecsTo(QTime::currentTime()) << "ms, size is now" << currentSize; } }