diff options
author | Nikolai Kosjar <nikolai.kosjar@theqtcompany.com> | 2015-11-06 16:50:02 +0100 |
---|---|---|
committer | Erik Verbruggen <erik.verbruggen@theqtcompany.com> | 2015-11-09 12:10:14 +0000 |
commit | 9d7b0541206085d37b2aacef57a1a8fc37db4b7b (patch) | |
tree | 726c60f92555e571f5882f8ff580ac96f400f85c /src/plugins/cpptools/cppmodelmanager.cpp | |
parent | 4bf0ca6bebe880fdb4f0b6bdd8fae1c7cb5db51a (diff) | |
download | qt-creator-9d7b0541206085d37b2aacef57a1a8fc37db4b7b.tar.gz |
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>
Diffstat (limited to 'src/plugins/cpptools/cppmodelmanager.cpp')
-rw-r--r-- | src/plugins/cpptools/cppmodelmanager.cpp | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp index 61e87cf7a9..f82f414aee 100644 --- a/src/plugins/cpptools/cppmodelmanager.cpp +++ b/src/plugins/cpptools/cppmodelmanager.cpp @@ -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; } |