From f3e164af4f8e1cd86821fa937233cfbc2b059b3b Mon Sep 17 00:00:00 2001 From: David Schulz Date: Wed, 5 Jun 2024 10:50:43 +0200 Subject: [PATCH] ProjectExplorer: prepare for parallelization of recursive file scan Change-Id: Ia2db3ef0fe619907c1ed30b8f984de4de04cc477 Reviewed-by: Jarek Kobus --- .../cmakeprojectmanager/cmakebuildsystem.cpp | 11 +++++++--- .../cmakeprojectmanager/cmakebuildsystem.h | 3 ++- .../compilationdatabaseproject.cpp | 6 +++++- .../compilationdatabaseutils.h | 3 ++- .../compilationdbparser.cpp | 20 ++++++++++++++++--- .../compilationdbparser.h | 1 + src/plugins/nim/project/nimbuildsystem.cpp | 15 +++++++------- 7 files changed, 42 insertions(+), 17 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp b/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp index 7b2520cc903..730cdaed4cf 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp @@ -83,12 +83,17 @@ CMakeBuildSystem::CMakeBuildSystem(CMakeBuildConfiguration *bc) // Cache mime check result for speed up if (!isIgnored) { - auto it = m_mimeBinaryCache.find(mimeType.name()); - if (it != m_mimeBinaryCache.end()) { + if (auto it = m_mimeBinaryCache.get>( + [mimeType](const QHash &cache) -> std::optional { + auto it = cache.find(mimeType.name()); + if (it != cache.end()) + return *it; + return {}; + })) { isIgnored = *it; } else { isIgnored = TreeScanner::isMimeBinary(mimeType, fn); - m_mimeBinaryCache[mimeType.name()] = isIgnored; + m_mimeBinaryCache.writeLocked()->insert(mimeType.name(), isIgnored); } } diff --git a/src/plugins/cmakeprojectmanager/cmakebuildsystem.h b/src/plugins/cmakeprojectmanager/cmakebuildsystem.h index dd85a52e228..32966c64bbb 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildsystem.h +++ b/src/plugins/cmakeprojectmanager/cmakebuildsystem.h @@ -10,6 +10,7 @@ #include #include +#include #include namespace ProjectExplorer { @@ -221,7 +222,7 @@ private: ProjectExplorer::TreeScanner m_treeScanner; std::shared_ptr m_allFiles; - QHash m_mimeBinaryCache; + Utils::SynchronizedValue> m_mimeBinaryCache; bool m_waitingForParse = false; bool m_combinedScanAndParseResult = false; diff --git a/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseproject.cpp b/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseproject.cpp index ebe7ff44753..af22b135203 100644 --- a/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseproject.cpp +++ b/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseproject.cpp @@ -332,7 +332,11 @@ CompilationDatabaseBuildSystem::CompilationDatabaseBuildSystem(Target *target) this, &CompilationDatabaseBuildSystem::updateDeploymentData); } -CompilationDatabaseBuildSystem::~CompilationDatabaseBuildSystem() = default; +CompilationDatabaseBuildSystem::~CompilationDatabaseBuildSystem() +{ + if (m_parser) + delete m_parser; +} void CompilationDatabaseBuildSystem::triggerParsing() { diff --git a/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseutils.h b/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseutils.h index df0d4c9c9fe..dd202efbf39 100644 --- a/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseutils.h +++ b/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseutils.h @@ -4,6 +4,7 @@ #pragma once #include +#include #include @@ -29,7 +30,7 @@ public: QStringList extras; }; -using MimeBinaryCache = QHash; +using MimeBinaryCache = Utils::SynchronizedValue>; QStringList filterFromFileName(const QStringList &flags, const QString &fileName); diff --git a/src/plugins/compilationdatabaseprojectmanager/compilationdbparser.cpp b/src/plugins/compilationdatabaseprojectmanager/compilationdbparser.cpp index 1ba5a9a1f1b..d613c81faf5 100644 --- a/src/plugins/compilationdatabaseprojectmanager/compilationdbparser.cpp +++ b/src/plugins/compilationdatabaseprojectmanager/compilationdbparser.cpp @@ -130,6 +130,15 @@ CompilationDbParser::CompilationDbParser(const QString &projectName, }); } +CompilationDbParser::~CompilationDbParser() +{ + if (m_treeScanner && !m_treeScanner->isFinished()) { + auto future = m_treeScanner->future(); + future.cancel(); + future.waitForFinished(); + } +} + void CompilationDbParser::start() { // Check hash first. @@ -158,12 +167,17 @@ void CompilationDbParser::start() // Cache mime check result for speed up if (!isIgnored) { - auto it = m_mimeBinaryCache.find(mimeType.name()); - if (it != m_mimeBinaryCache.end()) { + if (auto it = m_mimeBinaryCache.get>( + [mimeType](const QHash &cache) -> std::optional { + auto it = cache.find(mimeType.name()); + if (it != cache.end()) + return *it; + return {}; + })) { isIgnored = *it; } else { isIgnored = TreeScanner::isMimeBinary(mimeType, fn); - m_mimeBinaryCache[mimeType.name()] = isIgnored; + m_mimeBinaryCache.writeLocked()->insert(mimeType.name(), isIgnored); } } diff --git a/src/plugins/compilationdatabaseprojectmanager/compilationdbparser.h b/src/plugins/compilationdatabaseprojectmanager/compilationdbparser.h index a06ba82581e..065dfbe129a 100644 --- a/src/plugins/compilationdatabaseprojectmanager/compilationdbparser.h +++ b/src/plugins/compilationdatabaseprojectmanager/compilationdbparser.h @@ -32,6 +32,7 @@ public: MimeBinaryCache &mimeBinaryCache, ProjectExplorer::BuildSystem::ParseGuard &&guard, QObject *parent = nullptr); + ~CompilationDbParser(); void setPreviousProjectFileHash(const QByteArray &fileHash) { m_projectFileHash = fileHash; } diff --git a/src/plugins/nim/project/nimbuildsystem.cpp b/src/plugins/nim/project/nimbuildsystem.cpp index ef7d6c47320..373a263ba27 100644 --- a/src/plugins/nim/project/nimbuildsystem.cpp +++ b/src/plugins/nim/project/nimbuildsystem.cpp @@ -25,14 +25,6 @@ const char EXCLUDED_FILES_KEY[] = "ExcludedFiles"; NimProjectScanner::NimProjectScanner(Project *project) : m_project(project) { - m_scanner.setFilter([this](const Utils::MimeType &, const FilePath &fp) { - const QString path = fp.toString(); - return excludedFiles().contains(path) - || path.endsWith(".nimproject") - || path.contains(".nimproject.user") - || path.contains(".nimble.user"); - }); - connect(&m_directoryWatcher, &FileSystemWatcher::directoryChanged, this, &NimProjectScanner::directoryChanged); connect(&m_directoryWatcher, &FileSystemWatcher::fileChanged, @@ -91,6 +83,13 @@ void NimProjectScanner::saveSettings() void NimProjectScanner::startScan() { + m_scanner.setFilter( + [excludedFiles = excludedFiles()](const Utils::MimeType &, const FilePath &fp) { + const QString path = fp.toString(); + return excludedFiles.contains(path) || path.endsWith(".nimproject") + || path.contains(".nimproject.user") || path.contains(".nimble.user"); + }); + m_scanner.asyncScanForFiles(m_project->projectDirectory()); }