From 90130f459629f3afa49a386e8a29cddffd21a6d1 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Fri, 4 Oct 2013 12:25:26 +0200 Subject: [PATCH] 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 --- src/plugins/cpptools/cppmodelmanager.cpp | 24 ++++++++++++++++-------- src/plugins/cpptools/cppmodelmanager.h | 2 ++ 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 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 CppModelManager::updateProjectInfo(const ProjectInfo &newProjectInfo) { if (!newProjectInfo.isValid()) @@ -738,14 +751,7 @@ QFuture 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 &removedFiles); void removeProjectInfoFilesAndIncludesFromSnapshot(const ProjectInfo &projectInfo); -- GitLab