diff options
author | hjk <hjk@qt.io> | 2018-02-07 13:18:48 +0100 |
---|---|---|
committer | hjk <hjk@qt.io> | 2018-02-07 13:32:08 +0000 |
commit | 87543118d5516dba3d1fc111206db5df8dcc5b37 (patch) | |
tree | 8bd9755da124ef6af466d6ae4a1f9cb813cd1ee6 /src | |
parent | d5cd95c702a590ab0ccd9678418e3132cc43e350 (diff) |
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>
Diffstat (limited to 'src')
-rw-r--r-- | src/plugins/cpptools/builtinindexingsupport.cpp | 2 | ||||
-rw-r--r-- | src/plugins/cpptools/cppcurrentdocumentfilter.cpp | 4 | ||||
-rw-r--r-- | src/plugins/cpptools/cppcurrentdocumentfilter.h | 3 | ||||
-rw-r--r-- | src/plugins/cpptools/cpplocatordata.cpp | 10 | ||||
-rw-r--r-- | src/plugins/cpptools/cpplocatordata.h | 7 | ||||
-rw-r--r-- | src/plugins/cpptools/cppmodelmanager.cpp | 12 | ||||
-rw-r--r-- | src/plugins/cpptools/cppmodelmanager.h | 6 | ||||
-rw-r--r-- | src/plugins/cpptools/cpptoolsplugin.cpp | 19 | ||||
-rw-r--r-- | src/plugins/cpptools/cpptoolsplugin.h | 9 | ||||
-rw-r--r-- | src/plugins/cpptools/searchsymbols.cpp | 21 | ||||
-rw-r--r-- | src/plugins/cpptools/searchsymbols.h | 8 | ||||
-rw-r--r-- | src/plugins/cpptools/stringtable.cpp | 58 | ||||
-rw-r--r-- | src/plugins/cpptools/stringtable.h | 43 |
13 files changed, 97 insertions, 105 deletions
diff --git a/src/plugins/cpptools/builtinindexingsupport.cpp b/src/plugins/cpptools/builtinindexingsupport.cpp index d51ba79e1a..f14d091485 100644 --- a/src/plugins/cpptools/builtinindexingsupport.cpp +++ b/src/plugins/cpptools/builtinindexingsupport.cpp @@ -277,7 +277,7 @@ public: future.setProgressValue(0); int progress = 0; - SearchSymbols search(CppToolsPlugin::stringTable()); + SearchSymbols search; search.setSymbolsToSearchFor(m_parameters.types); CPlusPlus::Snapshot::const_iterator it = m_snapshot.begin(); diff --git a/src/plugins/cpptools/cppcurrentdocumentfilter.cpp b/src/plugins/cpptools/cppcurrentdocumentfilter.cpp index baace1529f..c1a0b9f5e4 100644 --- a/src/plugins/cpptools/cppcurrentdocumentfilter.cpp +++ b/src/plugins/cpptools/cppcurrentdocumentfilter.cpp @@ -37,10 +37,8 @@ using namespace CppTools::Internal; using namespace CPlusPlus; -CppCurrentDocumentFilter::CppCurrentDocumentFilter(CppTools::CppModelManager *manager, - StringTable &stringTable) +CppCurrentDocumentFilter::CppCurrentDocumentFilter(CppTools::CppModelManager *manager) : m_modelManager(manager) - , search(stringTable) { setId(Constants::CURRENT_DOCUMENT_FILTER_ID); setDisplayName(Constants::CURRENT_DOCUMENT_FILTER_DISPLAY_NAME); diff --git a/src/plugins/cpptools/cppcurrentdocumentfilter.h b/src/plugins/cpptools/cppcurrentdocumentfilter.h index d3452e26e1..147bb66309 100644 --- a/src/plugins/cpptools/cppcurrentdocumentfilter.h +++ b/src/plugins/cpptools/cppcurrentdocumentfilter.h @@ -42,8 +42,7 @@ class CppCurrentDocumentFilter : public Core::ILocatorFilter Q_OBJECT public: - explicit CppCurrentDocumentFilter(CppModelManager *manager, - StringTable &stringTable); + explicit CppCurrentDocumentFilter(CppModelManager *manager); ~CppCurrentDocumentFilter() {} QList<Core::LocatorFilterEntry> matchesFor(QFutureInterface<Core::LocatorFilterEntry> &future, diff --git a/src/plugins/cpptools/cpplocatordata.cpp b/src/plugins/cpptools/cpplocatordata.cpp index df80645f69..d736736191 100644 --- a/src/plugins/cpptools/cpplocatordata.cpp +++ b/src/plugins/cpptools/cpplocatordata.cpp @@ -24,7 +24,7 @@ ****************************************************************************/ #include "cpplocatordata.h" -#include "cpptoolsplugin.h" +#include "stringtable.h" using namespace CppTools; using namespace CppTools::Internal; @@ -32,9 +32,7 @@ using namespace CppTools::Internal; enum { MaxPendingDocuments = 10 }; CppLocatorData::CppLocatorData() - : m_strings(&CppToolsPlugin::stringTable()) - , m_search(CppToolsPlugin::stringTable()) - , m_pendingDocumentsMutex(QMutex::Recursive) + : m_pendingDocumentsMutex(QMutex::Recursive) { m_search.setSymbolsToSearchFor(SymbolSearcher::Enums | SymbolSearcher::Classes | @@ -79,7 +77,7 @@ void CppLocatorData::onAboutToRemoveFiles(const QStringList &files) } } - m_strings->scheduleGC(); + StringTable::scheduleGC(); flushPendingDocument(false); } @@ -93,7 +91,7 @@ void CppLocatorData::flushPendingDocument(bool force) const return; foreach (CPlusPlus::Document::Ptr doc, m_pendingDocuments) - m_infosByFile.insert(findOrInsertFilePath(doc->fileName()), m_search(doc)); + m_infosByFile.insert(StringTable::insert(doc->fileName()), m_search(doc)); m_pendingDocuments.clear(); m_pendingDocuments.reserve(MaxPendingDocuments); diff --git a/src/plugins/cpptools/cpplocatordata.h b/src/plugins/cpptools/cpplocatordata.h index 2a835b46df..467646776e 100644 --- a/src/plugins/cpptools/cpplocatordata.h +++ b/src/plugins/cpptools/cpplocatordata.h @@ -28,7 +28,6 @@ #include "cpptools_global.h" #include "cppmodelmanager.h" #include "searchsymbols.h" -#include "stringtable.h" #include <cplusplus/CppDocument.h> @@ -64,12 +63,6 @@ private: void flushPendingDocument(bool force) const; QList<IndexItem::Ptr> allIndexItems(const QHash<QString, QList<IndexItem::Ptr>> &items) const; - QString findOrInsertFilePath(const QString &path) const - { return m_strings->insert(path); } - -private: - Internal::StringTable *m_strings = nullptr; // Used to avoid QString duplication - mutable SearchSymbols m_search; mutable QHash<QString, IndexItem::Ptr> m_infosByFile; diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp index 5ad004b76c..508bf76be4 100644 --- a/src/plugins/cpptools/cppmodelmanager.cpp +++ b/src/plugins/cpptools/cppmodelmanager.cpp @@ -41,10 +41,11 @@ #include "cpprefactoringchanges.h" #include "cpprefactoringengine.h" #include "cppsourceprocessor.h" -#include "cpptoolsconstants.h" #include "cpptoolsplugin.h" +#include "cpptoolsconstants.h" #include "cpptoolsreuse.h" #include "editordocumenthandle.h" +#include "stringtable.h" #include "symbolfinder.h" #include "symbolsfindfilter.h" #include "followsymbolinterface.h" @@ -442,16 +443,15 @@ void CppModelManager::resetFilters() setCurrentDocumentFilter(); } -void CppModelManager::createCppModelManager(Internal::CppToolsPlugin *parent, - Internal::StringTable &stringTable) +void CppModelManager::createCppModelManager(Internal::CppToolsPlugin *parent) { QTC_ASSERT(!m_instance, return;); m_instance = new CppModelManager(); - m_instance->initCppTools(stringTable); + m_instance->initCppTools(); m_instance->setParent(parent); } -void CppModelManager::initCppTools(Internal::StringTable &stringTable) +void CppModelManager::initCppTools() { // Objects connect(Core::VcsManager::instance(), &Core::VcsManager::repositoryChanged, @@ -477,7 +477,7 @@ void CppModelManager::initCppTools(Internal::StringTable &stringTable) setFunctionsFilter(std::make_unique<CppFunctionsFilter>(&d->m_locatorData)); setSymbolsFindFilter(std::make_unique<SymbolsFindFilter>(this)); setCurrentDocumentFilter( - std::make_unique<Internal::CppCurrentDocumentFilter>(this, stringTable)); + std::make_unique<Internal::CppCurrentDocumentFilter>(this)); } void CppModelManager::initializeBuiltinModelManagerSupport() diff --git a/src/plugins/cpptools/cppmodelmanager.h b/src/plugins/cpptools/cppmodelmanager.h index 17b2cca3ec..7bd7ce157a 100644 --- a/src/plugins/cpptools/cppmodelmanager.h +++ b/src/plugins/cpptools/cppmodelmanager.h @@ -31,7 +31,6 @@ #include "projectinfo.h" #include "projectpart.h" #include "projectpartheaderpath.h" -#include "stringtable.h" #include <cplusplus/cppmodelmanagerbase.h> #include <coreplugin/find/ifindfilter.h> @@ -94,8 +93,7 @@ public: ~CppModelManager(); static CppModelManager *instance(); - static void createCppModelManager(Internal::CppToolsPlugin *parent, - Internal::StringTable &stringTable); + static void createCppModelManager(Internal::CppToolsPlugin *parent); // Documented in source file. enum ProgressNotificationMode { @@ -273,7 +271,7 @@ private: ProjectExplorer::Macros internalDefinedMacros() const; void dumpModelManagerConfiguration(const QString &logFileId); - void initCppTools(Internal::StringTable &stringTable); + void initCppTools(); void resetFilters(); private: diff --git a/src/plugins/cpptools/cpptoolsplugin.cpp b/src/plugins/cpptools/cpptoolsplugin.cpp index 3cd62a7778..152ecba8aa 100644 --- a/src/plugins/cpptools/cpptoolsplugin.cpp +++ b/src/plugins/cpptools/cpptoolsplugin.cpp @@ -35,6 +35,7 @@ #include "cppprojectfile.h" #include "cpptoolsbridge.h" #include "projectinfo.h" +#include "stringtable.h" #include "cpptoolsbridgeqtcreatorimplementation.h" #include <coreplugin/actionmanager/actioncontainer.h> @@ -74,13 +75,14 @@ enum { debug = 0 }; static CppToolsPlugin *m_instance = nullptr; static QHash<QString, QString> m_headerSourceMapping; -class CppToolsPluginPluginPrivate +class CppToolsPluginPrivate { public: - CppToolsPluginPluginPrivate() + CppToolsPluginPrivate() : m_codeModelSettings(new CppCodeModelSettings) { - CppModelManager::createCppModelManager(m_instance, m_stringTable); + StringTable::initialize(); + CppModelManager::createCppModelManager(m_instance); m_settings = new CppToolsSettings(m_instance); // force registration of cpp tools settings m_codeModelSettings->fromSettings(ICore::settings()); m_cppFileSettingsPage = new CppFileSettingsPage(m_instance->m_fileSettings); @@ -88,8 +90,9 @@ public: m_cppCodeStyleSettingsPage = new CppCodeStyleSettingsPage; } - ~CppToolsPluginPluginPrivate() + ~CppToolsPluginPrivate() { + StringTable::destroy(); delete m_cppFileSettingsPage; delete m_cppCodeModelSettingsPage; delete m_cppCodeStyleSettingsPage; @@ -97,7 +100,6 @@ public: QSharedPointer<CppCodeModelSettings> m_codeModelSettings; CppToolsSettings *m_settings = nullptr; - StringTable m_stringTable; CppFileSettingsPage *m_cppFileSettingsPage = nullptr; CppCodeModelSettingsPage *m_cppCodeModelSettingsPage = nullptr; CppCodeStyleSettingsPage *m_cppCodeStyleSettingsPage = nullptr; @@ -163,7 +165,7 @@ bool CppToolsPlugin::initialize(const QStringList &arguments, QString *error) Q_UNUSED(arguments) Q_UNUSED(error) - d = new CppToolsPluginPluginPrivate; + d = new CppToolsPluginPrivate; JsExpander::registerQObjectForJs(QLatin1String("Cpp"), new CppToolsJsExtension); @@ -219,11 +221,6 @@ QSharedPointer<CppCodeModelSettings> CppToolsPlugin::codeModelSettings() const return d->m_codeModelSettings; } -StringTable &CppToolsPlugin::stringTable() -{ - return m_instance->d->m_stringTable; -} - void CppToolsPlugin::switchHeaderSource() { CppTools::switchHeaderSource(); diff --git a/src/plugins/cpptools/cpptoolsplugin.h b/src/plugins/cpptools/cpptoolsplugin.h index 077fddf56d..25ae97f1c8 100644 --- a/src/plugins/cpptools/cpptoolsplugin.h +++ b/src/plugins/cpptools/cpptoolsplugin.h @@ -26,7 +26,6 @@ #pragma once #include "cpptools_global.h" -#include "stringtable.h" #include <projectexplorer/projectexplorer.h> @@ -47,7 +46,7 @@ class CppCodeModelSettings; namespace Internal { struct CppFileSettings; -class CppToolsPluginPluginPrivate; +class CppToolsPluginPrivate; class CppToolsPlugin : public ExtensionSystem::IPlugin { @@ -72,8 +71,6 @@ public: QSharedPointer<CppCodeModelSettings> codeModelSettings() const; - static StringTable &stringTable(); - public slots: void switchHeaderSource(); void switchHeaderSourceInNextSplit(); @@ -180,8 +177,8 @@ private slots: #endif private: - friend class CppToolsPluginPluginPrivate; - CppToolsPluginPluginPrivate *d = nullptr; + friend class CppToolsPluginPrivate; + CppToolsPluginPrivate *d = nullptr; QSharedPointer<CppFileSettings> m_fileSettings; }; diff --git a/src/plugins/cpptools/searchsymbols.cpp b/src/plugins/cpptools/searchsymbols.cpp index 68988d099c..9ec44a3ba7 100644 --- a/src/plugins/cpptools/searchsymbols.cpp +++ b/src/plugins/cpptools/searchsymbols.cpp @@ -24,6 +24,7 @@ ****************************************************************************/ #include "searchsymbols.h" +#include "stringtable.h" #include <cplusplus/Icons.h> #include <cplusplus/LookupContext.h> @@ -45,9 +46,8 @@ SearchSymbols::SymbolTypes SearchSymbols::AllTypes = | SymbolSearcher::Enums | SymbolSearcher::Declarations; -SearchSymbols::SearchSymbols(Internal::StringTable &stringTable) - : strings(stringTable) - , symbolsToSearchFor(SymbolSearcher::Classes | SymbolSearcher::Functions | SymbolSearcher::Enums) +SearchSymbols::SearchSymbols() + : symbolsToSearchFor(SymbolSearcher::Classes | SymbolSearcher::Functions | SymbolSearcher::Enums) { } @@ -58,7 +58,7 @@ void SearchSymbols::setSymbolsToSearchFor(const SymbolTypes &types) IndexItem::Ptr SearchSymbols::operator()(Document::Ptr doc, const QString &scope) { - IndexItem::Ptr root = IndexItem::create(findOrInsert(doc->fileName()), 100); + IndexItem::Ptr root = IndexItem::create(Internal::StringTable::insert(doc->fileName()), 100); { // RAII scope ScopedIndexItemPtr parentRaii(_parent, root); @@ -67,13 +67,13 @@ IndexItem::Ptr SearchSymbols::operator()(Document::Ptr doc, const QString &scope QTC_ASSERT(_parent, return IndexItem::Ptr()); QTC_ASSERT(root, return IndexItem::Ptr()); - QTC_ASSERT(_parent->fileName() == findOrInsert(doc->fileName()), + QTC_ASSERT(_parent->fileName() == Internal::StringTable::insert(doc->fileName()), return IndexItem::Ptr()); for (unsigned i = 0, ei = doc->globalSymbolCount(); i != ei; ++i) accept(doc->globalSymbolAt(i)); - strings.scheduleGC(); + Internal::StringTable::scheduleGC(); m_paths.clear(); } @@ -294,11 +294,12 @@ IndexItem::Ptr SearchSymbols::addChildItem(const QString &symbolName, const QStr } const QIcon icon = Icons::iconForSymbol(symbol); - IndexItem::Ptr newItem = IndexItem::create(findOrInsert(symbolName), - findOrInsert(symbolType), - findOrInsert(symbolScope), + + IndexItem::Ptr newItem = IndexItem::create(Internal::StringTable::insert(symbolName), + Internal::StringTable::insert(symbolType), + Internal::StringTable::insert(symbolScope), itemType, - findOrInsert(path), + Internal::StringTable::insert(path), symbol->line(), symbol->column() - 1, // 1-based vs 0-based column icon); diff --git a/src/plugins/cpptools/searchsymbols.h b/src/plugins/cpptools/searchsymbols.h index 68580d6156..b89b77e03d 100644 --- a/src/plugins/cpptools/searchsymbols.h +++ b/src/plugins/cpptools/searchsymbols.h @@ -28,7 +28,6 @@ #include "cpptools_global.h" #include "cppindexingsupport.h" #include "indexitem.h" -#include "stringtable.h" #include <cplusplus/CppDocument.h> #include <cplusplus/Overview.h> @@ -46,7 +45,7 @@ public: static SymbolTypes AllTypes; - SearchSymbols(Internal::StringTable &stringTable); + SearchSymbols(); void setSymbolsToSearchFor(const SymbolTypes &types); @@ -98,11 +97,6 @@ private: template<class T> void processFunction(T *func); private: - QString findOrInsert(const QString &s) - { return strings.insert(s); } - - Internal::StringTable &strings; // Used to avoid QString duplication - IndexItem::Ptr _parent; QString _scope; CPlusPlus::Overview overview; diff --git a/src/plugins/cpptools/stringtable.cpp b/src/plugins/cpptools/stringtable.cpp index a3bcf443c4..d9d806d239 100644 --- a/src/plugins/cpptools/stringtable.cpp +++ b/src/plugins/cpptools/stringtable.cpp @@ -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,11 +79,16 @@ 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); diff --git a/src/plugins/cpptools/stringtable.h b/src/plugins/cpptools/stringtable.h index 3eed7a0ed0..fdac41f1b1 100644 --- a/src/plugins/cpptools/stringtable.h +++ b/src/plugins/cpptools/stringtable.h @@ -25,45 +25,24 @@ #pragma once -#include <QAtomicInt> -#include <QMutex> -#include <QObject> -#include <QRunnable> -#include <QSet> -#include <QTimer> +#include <QString> namespace CppTools { namespace Internal { -class StringTable: public QObject -{ - Q_OBJECT +class CppToolsPluginPrivate; +class StringTable +{ public: - StringTable(); - - QString insert(const QString &string); - void scheduleGC(); - -private: - void startGC(); - void GC(); - - class GCRunner: public QRunnable { - StringTable &m_stringTable; - - public: - GCRunner(StringTable &stringTable): m_stringTable(stringTable) {} - virtual void run() { m_stringTable.GC(); } - } m_gcRunner; - friend class GCRunner; + static QString insert(const QString &string); + static void scheduleGC(); private: - mutable QMutex m_lock; - QAtomicInt m_stopGCRequested; - QSet<QString> m_strings; - QTimer m_gcCountDown; + friend class CppToolsPluginPrivate; + static void initialize(); + static void destroy(); }; -} // Internal namespace -} // CppTools namespace +} // Internal +} // CppTools |