summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorNikolai Kosjar <nikolai.kosjar@digia.com>2013-10-04 12:25:26 +0200
committerNikolai Kosjar <nikolai.kosjar@digia.com>2013-10-09 15:02:45 +0200
commit90130f459629f3afa49a386e8a29cddffd21a6d1 (patch)
tree058fb2d93f076a147a1c2fc7c0c6b685c00fcf2d /src
parent802b67ff04e65d7037e1d483881405753a17a83a (diff)
downloadqt-creator-90130f459629f3afa49a386e8a29cddffd21a6d1.tar.gz
CppTools: Tests: Fix crash in test_modelmanager_gc_if_last_cppeditor_closed
The project that was referenced at cppeditor.cpp:711 was already deleted. CppModelManager::m_fileToProjectParts contained outdated information. Now it is updated if a project is closed. Exposed by commit d411c07. Change-Id: I6fee93a02c72a045dd44a05723ab39a1eeec616e Reviewed-by: Erik Verbruggen <erik.verbruggen@digia.com>
Diffstat (limited to 'src')
-rw-r--r--src/plugins/cpptools/cppmodelmanager.cpp24
-rw-r--r--src/plugins/cpptools/cppmodelmanager.h2
2 files changed, 18 insertions, 8 deletions
diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp
index 4c0c5ecba7..4dcbb2b6ea 100644
--- a/src/plugins/cpptools/cppmodelmanager.cpp
+++ b/src/plugins/cpptools/cppmodelmanager.cpp
@@ -681,6 +681,19 @@ private:
const QSet<QString> m_newSourceFiles;
};
+/// Make sure that m_projectMutex is locked when calling this.
+void CppModelManager::recalculateFileToProjectParts()
+{
+ m_fileToProjectParts.clear();
+ foreach (const ProjectInfo &projectInfo, m_projectToProjectsInfo) {
+ foreach (const ProjectPart::Ptr &projectPart, projectInfo.projectParts()) {
+ foreach (const ProjectFile &cxxFile, projectPart->files) {
+ m_fileToProjectParts[cxxFile.path].append(projectPart);
+ }
+ }
+ }
+}
+
QFuture<void> CppModelManager::updateProjectInfo(const ProjectInfo &newProjectInfo)
{
if (!newProjectInfo.isValid())
@@ -738,14 +751,7 @@ QFuture<void> CppModelManager::updateProjectInfo(const ProjectInfo &newProjectIn
// Update Project/ProjectInfo and File/ProjectPart table
m_dirty = true;
m_projectToProjectsInfo.insert(project, newProjectInfo);
- m_fileToProjectParts.clear();
- foreach (const ProjectInfo &projectInfo, m_projectToProjectsInfo) {
- foreach (const ProjectPart::Ptr &projectPart, projectInfo.projectParts()) {
- foreach (const ProjectFile &cxxFile, projectPart->files) {
- m_fileToProjectParts[cxxFile.path].append(projectPart);
- }
- }
- }
+ recalculateFileToProjectParts();
} // Mutex scope
@@ -823,6 +829,7 @@ void CppModelManager::onAboutToRemoveProject(ProjectExplorer::Project *project)
QMutexLocker locker(&m_projectMutex);
m_dirty = true;
m_projectToProjectsInfo.remove(project);
+ recalculateFileToProjectParts();
} while (0);
delayedGC();
@@ -841,6 +848,7 @@ void CppModelManager::onAboutToUnloadSession()
do {
QMutexLocker locker(&m_projectMutex);
m_projectToProjectsInfo.clear();
+ recalculateFileToProjectParts();
m_dirty = true;
} while (0);
}
diff --git a/src/plugins/cpptools/cppmodelmanager.h b/src/plugins/cpptools/cppmodelmanager.h
index e86875a63f..0bc4ee750d 100644
--- a/src/plugins/cpptools/cppmodelmanager.h
+++ b/src/plugins/cpptools/cppmodelmanager.h
@@ -170,6 +170,8 @@ private slots:
private:
void delayedGC();
+ void recalculateFileToProjectParts();
+
void replaceSnapshot(const CPlusPlus::Snapshot &newSnapshot);
void removeFilesFromSnapshot(const QSet<QString> &removedFiles);
void removeProjectInfoFilesAndIncludesFromSnapshot(const ProjectInfo &projectInfo);