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>
This commit is contained in:
Nikolai Kosjar
2013-10-04 12:25:26 +02:00
parent 802b67ff04
commit 90130f4596
2 changed files with 18 additions and 8 deletions

View File

@@ -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);
}