CppTools: Fix potential race condition

...when acessing m_headerPaths, m_projectFiles or m_definedMacros from
different threads.

ensureUpdated() locked the mutex before writing the variables, but
reading them happened with an unlocked mutex.

Change-Id: I4951fd58f1939e4e50534a018dd600004789668e
Reviewed-by: Erik Verbruggen <erik.verbruggen@theqtcompany.com>
This commit is contained in:
Nikolai Kosjar
2015-11-06 16:50:02 +01:00
committed by Erik Verbruggen
parent 4bf0ca6beb
commit 9d7b054120
2 changed files with 13 additions and 7 deletions

View File

@@ -384,9 +384,9 @@ bool CppModelManager::replaceDocument(Document::Ptr newDoc)
return true;
}
/// Make sure that m_projectMutex is locked when calling this.
void CppModelManager::ensureUpdated()
{
QMutexLocker locker(&d->m_projectMutex);
if (!d->m_dirty)
return;
@@ -475,8 +475,7 @@ void CppModelManager::dumpModelManagerConfiguration(const QString &logFileId)
dumper.dumpProjectInfos(projectInfos());
dumper.dumpSnapshot(globalSnapshot, globalSnapshotTitle, /*isGlobalSnapshot=*/ true);
dumper.dumpWorkingCopy(workingCopy());
ensureUpdated();
dumper.dumpMergedEntities(d->m_headerPaths, d->m_definedMacros);
dumper.dumpMergedEntities(headerPaths(), definedMacros());
}
QSet<AbstractEditorSupport *> CppModelManager::abstractEditorSupports() const
@@ -941,12 +940,12 @@ QList<ProjectPart::Ptr> CppModelManager::projectPartFromDependencies(
return parts.values();
}
ProjectPart::Ptr CppModelManager::fallbackProjectPart() const
ProjectPart::Ptr CppModelManager::fallbackProjectPart()
{
ProjectPart::Ptr part(new ProjectPart);
part->projectDefines = d->m_definedMacros;
part->headerPaths = d->m_headerPaths;
part->projectDefines = definedMacros();
part->headerPaths = headerPaths();
part->languageVersion = ProjectPart::CXX14;
// Do not activate ObjectiveCExtensions since this will lead to the
@@ -1259,24 +1258,31 @@ CppIndexingSupport *CppModelManager::indexingSupport()
QStringList CppModelManager::projectFiles()
{
QMutexLocker locker(&d->m_projectMutex);
ensureUpdated();
return d->m_projectFiles;
}
ProjectPart::HeaderPaths CppModelManager::headerPaths()
{
QMutexLocker locker(&d->m_projectMutex);
ensureUpdated();
return d->m_headerPaths;
}
void CppModelManager::setHeaderPaths(const ProjectPart::HeaderPaths &headerPaths)
{
QMutexLocker locker(&d->m_projectMutex);
d->m_headerPaths = headerPaths;
}
QByteArray CppModelManager::definedMacros()
{
QMutexLocker locker(&d->m_projectMutex);
ensureUpdated();
return d->m_definedMacros;
}