summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/plugins/cpptools/cppmodelmanager.cpp39
1 files changed, 21 insertions, 18 deletions
diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp
index 74ac1557fc..d4e347b861 100644
--- a/src/plugins/cpptools/cppmodelmanager.cpp
+++ b/src/plugins/cpptools/cppmodelmanager.cpp
@@ -77,9 +77,12 @@
#include <QDir>
#include <QFutureWatcher>
#include <QMutexLocker>
+#include <QReadLocker>
+#include <QReadWriteLock>
#include <QTextBlock>
#include <QThreadPool>
#include <QTimer>
+#include <QWriteLocker>
#if defined(QTCREATOR_WITH_DUMP_AST) && defined(Q_CC_GNU)
#define WITH_AST_DUMP
@@ -163,7 +166,7 @@ public:
Snapshot m_snapshot;
// Project integration
- mutable QMutex m_projectMutex;
+ QReadWriteLock m_projectLock;
QHash<ProjectExplorer::Project *, ProjectData> m_projectData;
QMap<Utils::FilePath, QList<ProjectPart::Ptr> > m_fileToProjectParts;
QMap<QString, ProjectPart::Ptr> m_projectPartIdToProjectProjectPart;
@@ -742,7 +745,7 @@ bool CppModelManager::replaceDocument(Document::Ptr newDoc)
return true;
}
-/// Make sure that m_projectMutex is locked when calling this.
+/// Make sure that m_projectLock is locked for writing when calling this.
void CppModelManager::ensureUpdated()
{
if (!d->m_dirty)
@@ -981,14 +984,14 @@ QFuture<void> CppModelManager::updateSourceFiles(const QSet<QString> &sourceFile
QList<ProjectInfo::Ptr> CppModelManager::projectInfos() const
{
- QMutexLocker locker(&d->m_projectMutex);
+ QReadLocker locker(&d->m_projectLock);
return Utils::transform<QList<ProjectInfo::Ptr>>(d->m_projectData,
[](const ProjectData &d) { return d.projectInfo; });
}
ProjectInfo::Ptr CppModelManager::projectInfo(ProjectExplorer::Project *project) const
{
- QMutexLocker locker(&d->m_projectMutex);
+ QReadLocker locker(&d->m_projectLock);
return d->m_projectData.value(project).projectInfo;
}
@@ -1089,7 +1092,7 @@ private:
const QSet<QString> m_newSourceFiles;
};
-/// Make sure that m_projectMutex is locked when calling this.
+/// Make sure that m_projectLock is locked for writing when calling this.
void CppModelManager::recalculateProjectPartMappings()
{
d->m_projectPartIdToProjectProjectPart.clear();
@@ -1169,8 +1172,8 @@ QFuture<void> CppModelManager::updateProjectInfo(const ProjectInfo::Ptr &newProj
return {};
ProjectData *projectData = nullptr;
- { // Only hold the mutex for a limited scope, so the dumping afterwards does not deadlock.
- QMutexLocker projectLocker(&d->m_projectMutex);
+ { // Only hold the lock for a limited scope, so the dumping afterwards does not deadlock.
+ QWriteLocker projectLocker(&d->m_projectLock);
const QSet<QString> newSourceFiles = newProjectInfo->sourceFiles();
@@ -1230,7 +1233,7 @@ QFuture<void> CppModelManager::updateProjectInfo(const ProjectInfo::Ptr &newProj
? &(d->m_projectData[project] = ProjectData{newProjectInfo, nullptr, false})
: &(*it);
recalculateProjectPartMappings();
- } // Mutex scope
+ } // Locker scope
// If requested, dump everything we got
if (DumpProjectInfo)
@@ -1260,7 +1263,6 @@ QFuture<void> CppModelManager::updateProjectInfo(const ProjectInfo::Ptr &newProj
// It's safe to do this here, as only the UI thread writes to the map and no other thread
// uses the indexer value.
- // FIXME: Use a read/write lock instead of a mutex.
d->setupWatcher(indexingFuture, project, projectData, this);
return indexingFuture;
@@ -1268,12 +1270,13 @@ QFuture<void> CppModelManager::updateProjectInfo(const ProjectInfo::Ptr &newProj
ProjectPart::Ptr CppModelManager::projectPartForId(const QString &projectPartId) const
{
+ QReadLocker locker(&d->m_projectLock);
return d->m_projectPartIdToProjectProjectPart.value(projectPartId);
}
QList<ProjectPart::Ptr> CppModelManager::projectPart(const Utils::FilePath &fileName) const
{
- QMutexLocker locker(&d->m_projectMutex);
+ QReadLocker locker(&d->m_projectLock);
return d->m_fileToProjectParts.value(fileName);
}
@@ -1283,7 +1286,7 @@ QList<ProjectPart::Ptr> CppModelManager::projectPartFromDependencies(
QSet<ProjectPart::Ptr> parts;
const Utils::FilePaths deps = snapshot().filesDependingOn(fileName);
- QMutexLocker locker(&d->m_projectMutex);
+ QReadLocker locker(&d->m_projectLock);
for (const Utils::FilePath &dep : deps)
parts.unite(Utils::toSet(d->m_fileToProjectParts.value(dep)));
@@ -1331,7 +1334,7 @@ void CppModelManager::emitAbstractEditorSupportRemoved(const QString &filePath)
void CppModelManager::onProjectAdded(ProjectExplorer::Project *)
{
- QMutexLocker locker(&d->m_projectMutex);
+ QWriteLocker locker(&d->m_projectLock);
d->m_dirty = true;
}
@@ -1354,7 +1357,7 @@ void CppModelManager::onAboutToRemoveProject(ProjectExplorer::Project *project)
QStringList idsOfRemovedProjectParts;
{
- QMutexLocker locker(&d->m_projectMutex);
+ QWriteLocker locker(&d->m_projectLock);
d->m_dirty = true;
const QStringList projectPartsIdsBefore = d->m_projectPartIdToProjectProjectPart.keys();
@@ -1377,7 +1380,7 @@ void CppModelManager::onActiveProjectChanged(ProjectExplorer::Project *project)
return; // Last project closed.
{
- QMutexLocker locker(&d->m_projectMutex);
+ QReadLocker locker(&d->m_projectLock);
if (!d->m_projectData.contains(project))
return; // Not yet known to us.
}
@@ -1670,7 +1673,7 @@ CppIndexingSupport *CppModelManager::indexingSupport()
QStringList CppModelManager::projectFiles()
{
- QMutexLocker locker(&d->m_projectMutex);
+ QWriteLocker locker(&d->m_projectLock);
ensureUpdated();
return d->m_projectFiles;
@@ -1678,7 +1681,7 @@ QStringList CppModelManager::projectFiles()
ProjectExplorer::HeaderPaths CppModelManager::headerPaths()
{
- QMutexLocker locker(&d->m_projectMutex);
+ QWriteLocker locker(&d->m_projectLock);
ensureUpdated();
return d->m_headerPaths;
@@ -1686,13 +1689,13 @@ ProjectExplorer::HeaderPaths CppModelManager::headerPaths()
void CppModelManager::setHeaderPaths(const ProjectExplorer::HeaderPaths &headerPaths)
{
- QMutexLocker locker(&d->m_projectMutex);
+ QWriteLocker locker(&d->m_projectLock);
d->m_headerPaths = headerPaths;
}
ProjectExplorer::Macros CppModelManager::definedMacros()
{
- QMutexLocker locker(&d->m_projectMutex);
+ QWriteLocker locker(&d->m_projectLock);
ensureUpdated();
return d->m_definedMacros;