diff options
author | Nikolai Kosjar <nikolai.kosjar@digia.com> | 2013-10-04 12:25:26 +0200 |
---|---|---|
committer | Nikolai Kosjar <nikolai.kosjar@digia.com> | 2013-10-09 15:02:45 +0200 |
commit | 90130f459629f3afa49a386e8a29cddffd21a6d1 (patch) | |
tree | 058fb2d93f076a147a1c2fc7c0c6b685c00fcf2d /src | |
parent | 802b67ff04e65d7037e1d483881405753a17a83a (diff) | |
download | qt-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.cpp | 24 | ||||
-rw-r--r-- | 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<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); |