diff options
author | Nikolai Kosjar <nikolai.kosjar@digia.com> | 2013-07-18 10:57:19 +0200 |
---|---|---|
committer | Nikolai Kosjar <nikolai.kosjar@digia.com> | 2013-08-08 12:12:08 +0200 |
commit | 7583039b87c2908d40017ba1c245fed0b471c0f9 (patch) | |
tree | 841318daad7e0ee6263a67140e27b2d97f600bec /src/plugins/cpptools/cppmodelmanager.cpp | |
parent | 4bc61ecac4701a0e4f4fa5c7e48986dcd687c11a (diff) | |
download | qt-creator-7583039b87c2908d40017ba1c245fed0b471c0f9.tar.gz |
CppTools: Do not call GC() more than necessary
Currently GC() is invoked if
- 5 CppEditors were closed or the last CppEditor was closed
- a project is about to be removed
- a session is about to be unloaded
Thus, for the following use cases, too much GC() calls (can) happen:
- File > Close All
- Close All Projects and Editors
- Changing the session
Fixed by introducing a timer.
Change-Id: I9c984d9de735fc8c6ee77a518e9fb5b63dba5881
Reviewed-by: Erik Verbruggen <erik.verbruggen@digia.com>
Diffstat (limited to 'src/plugins/cpptools/cppmodelmanager.cpp')
-rw-r--r-- | src/plugins/cpptools/cppmodelmanager.cpp | 24 |
1 files changed, 21 insertions, 3 deletions
diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp index ed1ebd1479..cc1979d6b7 100644 --- a/src/plugins/cpptools/cppmodelmanager.cpp +++ b/src/plugins/cpptools/cppmodelmanager.cpp @@ -233,6 +233,10 @@ CppModelManager::CppModelManager(QObject *parent) ProjectExplorer::ProjectExplorerPlugin *pe = ProjectExplorer::ProjectExplorerPlugin::instance(); QTC_ASSERT(pe, return); + m_delayedGcTimer = new QTimer(this); + m_delayedGcTimer->setSingleShot(true); + connect(m_delayedGcTimer, SIGNAL(timeout()), this, SLOT(GC())); + ProjectExplorer::SessionManager *session = pe->session(); connect(session, SIGNAL(projectAdded(ProjectExplorer::Project*)), this, SLOT(onProjectAdded(ProjectExplorer::Project*))); @@ -240,6 +244,9 @@ CppModelManager::CppModelManager(QObject *parent) connect(session, SIGNAL(aboutToRemoveProject(ProjectExplorer::Project*)), this, SLOT(onAboutToRemoveProject(ProjectExplorer::Project*))); + connect(session, SIGNAL(aboutToLoadSession(QString)), + this, SLOT(onAboutToLoadSession())); + connect(session, SIGNAL(aboutToUnloadSession(QString)), this, SLOT(onAboutToUnloadSession())); @@ -481,7 +488,7 @@ void CppModelManager::deleteCppEditorSupport(TextEditor::BaseTextEditor *textEdi ++numberOfClosedEditors; if (numberOfOpenEditors == 0 || numberOfClosedEditors == 5) { numberOfClosedEditors = 0; - GC(); + delayedGC(); } } @@ -663,6 +670,11 @@ void CppModelManager::onProjectAdded(ProjectExplorer::Project *) m_dirty = true; } +void CppModelManager::delayedGC() +{ + m_delayedGcTimer->start(500); +} + void CppModelManager::onAboutToRemoveProject(ProjectExplorer::Project *project) { do { @@ -671,6 +683,13 @@ void CppModelManager::onAboutToRemoveProject(ProjectExplorer::Project *project) m_projectToProjectsInfo.remove(project); } while (0); + delayedGC(); +} + +void CppModelManager::onAboutToLoadSession() +{ + if (m_delayedGcTimer->isActive()) + m_delayedGcTimer->stop(); GC(); } @@ -683,8 +702,6 @@ void CppModelManager::onAboutToUnloadSession() m_projectToProjectsInfo.clear(); m_dirty = true; } while (0); - - GC(); } void CppModelManager::onCoreAboutToClose() @@ -729,6 +746,7 @@ void CppModelManager::GC() // Announce removing files and replace the snapshot emit aboutToRemoveFiles(notReachableFiles); replaceSnapshot(newSnapshot); + emit gcFinished(); } void CppModelManager::finishedRefreshingSourceFiles(const QStringList &files) |