ProjectExplorer: prepare for parallelization of recursive file scan

Change-Id: Ia2db3ef0fe619907c1ed30b8f984de4de04cc477
Reviewed-by: Jarek Kobus <jaroslaw.kobus@qt.io>
This commit is contained in:
David Schulz
2024-06-05 10:50:43 +02:00
parent 5b93e34c00
commit f3e164af4f
7 changed files with 42 additions and 17 deletions

View File

@@ -83,12 +83,17 @@ CMakeBuildSystem::CMakeBuildSystem(CMakeBuildConfiguration *bc)
// Cache mime check result for speed up // Cache mime check result for speed up
if (!isIgnored) { if (!isIgnored) {
auto it = m_mimeBinaryCache.find(mimeType.name()); if (auto it = m_mimeBinaryCache.get<std::optional<bool>>(
if (it != m_mimeBinaryCache.end()) { [mimeType](const QHash<QString, bool> &cache) -> std::optional<bool> {
auto it = cache.find(mimeType.name());
if (it != cache.end())
return *it;
return {};
})) {
isIgnored = *it; isIgnored = *it;
} else { } else {
isIgnored = TreeScanner::isMimeBinary(mimeType, fn); isIgnored = TreeScanner::isMimeBinary(mimeType, fn);
m_mimeBinaryCache[mimeType.name()] = isIgnored; m_mimeBinaryCache.writeLocked()->insert(mimeType.name(), isIgnored);
} }
} }

View File

@@ -10,6 +10,7 @@
#include <projectexplorer/buildconfiguration.h> #include <projectexplorer/buildconfiguration.h>
#include <projectexplorer/buildsystem.h> #include <projectexplorer/buildsystem.h>
#include <utils/synchronizedvalue.h>
#include <utils/temporarydirectory.h> #include <utils/temporarydirectory.h>
namespace ProjectExplorer { namespace ProjectExplorer {
@@ -221,7 +222,7 @@ private:
ProjectExplorer::TreeScanner m_treeScanner; ProjectExplorer::TreeScanner m_treeScanner;
std::shared_ptr<ProjectExplorer::FolderNode> m_allFiles; std::shared_ptr<ProjectExplorer::FolderNode> m_allFiles;
QHash<QString, bool> m_mimeBinaryCache; Utils::SynchronizedValue<QHash<QString, bool>> m_mimeBinaryCache;
bool m_waitingForParse = false; bool m_waitingForParse = false;
bool m_combinedScanAndParseResult = false; bool m_combinedScanAndParseResult = false;

View File

@@ -332,7 +332,11 @@ CompilationDatabaseBuildSystem::CompilationDatabaseBuildSystem(Target *target)
this, &CompilationDatabaseBuildSystem::updateDeploymentData); this, &CompilationDatabaseBuildSystem::updateDeploymentData);
} }
CompilationDatabaseBuildSystem::~CompilationDatabaseBuildSystem() = default; CompilationDatabaseBuildSystem::~CompilationDatabaseBuildSystem()
{
if (m_parser)
delete m_parser;
}
void CompilationDatabaseBuildSystem::triggerParsing() void CompilationDatabaseBuildSystem::triggerParsing()
{ {

View File

@@ -4,6 +4,7 @@
#pragma once #pragma once
#include <cppeditor/cppprojectfile.h> #include <cppeditor/cppprojectfile.h>
#include <utils/synchronizedvalue.h>
#include <QHash> #include <QHash>
@@ -29,7 +30,7 @@ public:
QStringList extras; QStringList extras;
}; };
using MimeBinaryCache = QHash<QString, bool>; using MimeBinaryCache = Utils::SynchronizedValue<QHash<QString, bool>>;
QStringList filterFromFileName(const QStringList &flags, const QString &fileName); QStringList filterFromFileName(const QStringList &flags, const QString &fileName);

View File

@@ -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() void CompilationDbParser::start()
{ {
// Check hash first. // Check hash first.
@@ -158,12 +167,17 @@ void CompilationDbParser::start()
// Cache mime check result for speed up // Cache mime check result for speed up
if (!isIgnored) { if (!isIgnored) {
auto it = m_mimeBinaryCache.find(mimeType.name()); if (auto it = m_mimeBinaryCache.get<std::optional<bool>>(
if (it != m_mimeBinaryCache.end()) { [mimeType](const QHash<QString, bool> &cache) -> std::optional<bool> {
auto it = cache.find(mimeType.name());
if (it != cache.end())
return *it;
return {};
})) {
isIgnored = *it; isIgnored = *it;
} else { } else {
isIgnored = TreeScanner::isMimeBinary(mimeType, fn); isIgnored = TreeScanner::isMimeBinary(mimeType, fn);
m_mimeBinaryCache[mimeType.name()] = isIgnored; m_mimeBinaryCache.writeLocked()->insert(mimeType.name(), isIgnored);
} }
} }

View File

@@ -32,6 +32,7 @@ public:
MimeBinaryCache &mimeBinaryCache, MimeBinaryCache &mimeBinaryCache,
ProjectExplorer::BuildSystem::ParseGuard &&guard, ProjectExplorer::BuildSystem::ParseGuard &&guard,
QObject *parent = nullptr); QObject *parent = nullptr);
~CompilationDbParser();
void setPreviousProjectFileHash(const QByteArray &fileHash) { m_projectFileHash = fileHash; } void setPreviousProjectFileHash(const QByteArray &fileHash) { m_projectFileHash = fileHash; }

View File

@@ -25,14 +25,6 @@ const char EXCLUDED_FILES_KEY[] = "ExcludedFiles";
NimProjectScanner::NimProjectScanner(Project *project) NimProjectScanner::NimProjectScanner(Project *project)
: m_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, connect(&m_directoryWatcher, &FileSystemWatcher::directoryChanged,
this, &NimProjectScanner::directoryChanged); this, &NimProjectScanner::directoryChanged);
connect(&m_directoryWatcher, &FileSystemWatcher::fileChanged, connect(&m_directoryWatcher, &FileSystemWatcher::fileChanged,
@@ -91,6 +83,13 @@ void NimProjectScanner::saveSettings()
void NimProjectScanner::startScan() 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()); m_scanner.asyncScanForFiles(m_project->projectDirectory());
} }