forked from qt-creator/qt-creator
CppTools: Apply 'static' pattern to StringTable
This also fixes a crash on loading (some?) projects introduced
in 577bf7c08a.
Change-Id: Ie35d466fa3b84b183118fe93f55393a4c59755de
Reviewed-by: Nikolai Kosjar <nikolai.kosjar@qt.io>
This commit is contained in:
@@ -28,8 +28,11 @@
|
||||
#include <utils/qtcassert.h>
|
||||
|
||||
#include <QDebug>
|
||||
#include <QMutex>
|
||||
#include <QSet>
|
||||
#include <QThreadPool>
|
||||
#include <QTime>
|
||||
#include <QTimer>
|
||||
|
||||
using namespace CppTools::Internal;
|
||||
|
||||
@@ -37,9 +40,37 @@ enum {
|
||||
GCTimeOut = 10 * 1000 // 10 seconds
|
||||
};
|
||||
|
||||
StringTable::StringTable()
|
||||
enum {
|
||||
DebugStringTable = 0
|
||||
};
|
||||
|
||||
class StringTablePrivate : public QObject
|
||||
{
|
||||
public:
|
||||
StringTablePrivate();
|
||||
|
||||
QString insert(const QString &string);
|
||||
void startGC() { QThreadPool::globalInstance()->start(&m_gcRunner); }
|
||||
void GC();
|
||||
|
||||
class GCRunner: public QRunnable {
|
||||
StringTablePrivate &m_stringTable;
|
||||
|
||||
public:
|
||||
GCRunner(StringTablePrivate &stringTable): m_stringTable(stringTable) {}
|
||||
virtual void run() { m_stringTable.GC(); }
|
||||
} m_gcRunner;
|
||||
|
||||
mutable QMutex m_lock;
|
||||
QAtomicInt m_stopGCRequested{false};
|
||||
QSet<QString> m_strings;
|
||||
QTimer m_gcCountDown;
|
||||
};
|
||||
|
||||
static StringTablePrivate *m_instance = nullptr;
|
||||
|
||||
StringTablePrivate::StringTablePrivate()
|
||||
: m_gcRunner(*this)
|
||||
, m_stopGCRequested(false)
|
||||
{
|
||||
m_strings.reserve(1000);
|
||||
|
||||
@@ -48,10 +79,15 @@ StringTable::StringTable()
|
||||
m_gcCountDown.setObjectName(QLatin1String("StringTable::m_gcCountDown"));
|
||||
m_gcCountDown.setSingleShot(true);
|
||||
m_gcCountDown.setInterval(GCTimeOut);
|
||||
connect(&m_gcCountDown, &QTimer::timeout, this, &StringTable::startGC);
|
||||
connect(&m_gcCountDown, &QTimer::timeout, this, &StringTablePrivate::startGC);
|
||||
}
|
||||
|
||||
QString StringTable::insert(const QString &string)
|
||||
{
|
||||
return m_instance->insert(string);
|
||||
}
|
||||
|
||||
QString StringTablePrivate::insert(const QString &string)
|
||||
{
|
||||
if (string.isEmpty())
|
||||
return string;
|
||||
@@ -70,17 +106,19 @@ QString StringTable::insert(const QString &string)
|
||||
|
||||
void StringTable::scheduleGC()
|
||||
{
|
||||
QMetaObject::invokeMethod(&m_gcCountDown, "start", Qt::QueuedConnection);
|
||||
QMetaObject::invokeMethod(&m_instance->m_gcCountDown, "start", Qt::QueuedConnection);
|
||||
}
|
||||
|
||||
void StringTable::startGC()
|
||||
void StringTable::initialize()
|
||||
{
|
||||
QThreadPool::globalInstance()->start(&m_gcRunner);
|
||||
m_instance = new StringTablePrivate;
|
||||
}
|
||||
|
||||
enum {
|
||||
DebugStringTable = 0
|
||||
};
|
||||
void StringTable::destroy()
|
||||
{
|
||||
delete m_instance;
|
||||
m_instance = nullptr;
|
||||
}
|
||||
|
||||
static inline bool isQStringInUse(const QString &string)
|
||||
{
|
||||
@@ -88,7 +126,7 @@ static inline bool isQStringInUse(const QString &string)
|
||||
return data_ptr->ref.isShared() || data_ptr->ref.isStatic();
|
||||
}
|
||||
|
||||
void StringTable::GC()
|
||||
void StringTablePrivate::GC()
|
||||
{
|
||||
QMutexLocker locker(&m_lock);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user