summaryrefslogtreecommitdiff
path: root/src/plugins/cpptools/stringtable.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/cpptools/stringtable.cpp')
-rw-r--r--src/plugins/cpptools/stringtable.cpp31
1 files changed, 20 insertions, 11 deletions
diff --git a/src/plugins/cpptools/stringtable.cpp b/src/plugins/cpptools/stringtable.cpp
index 5122c3a8a9..7f5d0178a3 100644
--- a/src/plugins/cpptools/stringtable.cpp
+++ b/src/plugins/cpptools/stringtable.cpp
@@ -26,9 +26,11 @@
#include "stringtable.h"
#include <utils/qtcassert.h>
+#include <utils/runextensions.h>
#include <QDebug>
#include <QElapsedTimer>
+#include <QFutureSynchronizer>
#include <QMutex>
#include <QSet>
#include <QThreadPool>
@@ -48,18 +50,14 @@ class StringTablePrivate : public QObject
{
public:
StringTablePrivate();
+ ~StringTablePrivate() override { m_futureSynchronizer.waitForFinished(); }
QString insert(const QString &string);
- void startGC() { QThreadPool::globalInstance()->start(&m_gcRunner); }
+ void addFuture(const QFuture<void> &future);
+ void startGC() { addFuture(Utils::runAsync(&StringTablePrivate::GC, this)); }
void GC();
- class GCRunner: public QRunnable {
- StringTablePrivate &m_stringTable;
-
- public:
- explicit GCRunner(StringTablePrivate &stringTable): m_stringTable(stringTable) {}
- void run() override { m_stringTable.GC(); }
- } m_gcRunner;
+ QFutureSynchronizer<void> m_futureSynchronizer;
mutable QMutex m_lock;
QAtomicInt m_stopGCRequested{false};
@@ -67,15 +65,26 @@ public:
QTimer m_gcCountDown;
};
+void StringTablePrivate::addFuture(const QFuture<void> &future)
+{
+ m_futureSynchronizer.addFuture(future);
+ const QList<QFuture<void>> futures = m_futureSynchronizer.futures();
+ const int maxFuturesCount = 10;
+ if (futures.count() <= maxFuturesCount)
+ return;
+ m_futureSynchronizer.clearFutures();
+ for (const auto &future : futures) {
+ if (!future.isFinished())
+ m_futureSynchronizer.addFuture(future);
+ }
+}
+
static StringTablePrivate *m_instance = nullptr;
StringTablePrivate::StringTablePrivate()
- : m_gcRunner(*this)
{
m_strings.reserve(1000);
- m_gcRunner.setAutoDelete(false);
-
m_gcCountDown.setObjectName(QLatin1String("StringTable::m_gcCountDown"));
m_gcCountDown.setSingleShot(true);
m_gcCountDown.setInterval(GCTimeOut);