summaryrefslogtreecommitdiff
path: root/src/plugins/cpptools/cppmodelmanager.cpp
diff options
context:
space:
mode:
authorNikolai Kosjar <nikolai.kosjar@digia.com>2013-07-18 10:57:19 +0200
committerNikolai Kosjar <nikolai.kosjar@digia.com>2013-08-08 12:12:08 +0200
commit7583039b87c2908d40017ba1c245fed0b471c0f9 (patch)
tree841318daad7e0ee6263a67140e27b2d97f600bec /src/plugins/cpptools/cppmodelmanager.cpp
parent4bc61ecac4701a0e4f4fa5c7e48986dcd687c11a (diff)
downloadqt-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.cpp24
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)