diff options
Diffstat (limited to 'src/tools')
5 files changed, 85 insertions, 20 deletions
diff --git a/src/tools/clangpchmanagerbackend/clangpchmanagerbackendmain.cpp b/src/tools/clangpchmanagerbackend/clangpchmanagerbackendmain.cpp index e91ca0159b..c7fe8e4138 100644 --- a/src/tools/clangpchmanagerbackend/clangpchmanagerbackendmain.cpp +++ b/src/tools/clangpchmanagerbackend/clangpchmanagerbackendmain.cpp @@ -213,7 +213,9 @@ struct Data // because we have a cycle dependency pchCreationProgressCounter, preCompiledHeaderStorage, database, - environment}; + environment, + fileSystem, + filePathCache}; ClangBackEnd::PchTasksMerger pchTaskMerger{pchTaskQueue}; ClangBackEnd::BuildDependenciesStorage<> buildDependencyStorage{database}; ClangBackEnd::BuildDependencyCollector buildDependencyCollector{filePathCache, diff --git a/src/tools/clangpchmanagerbackend/source/pchtaskqueue.cpp b/src/tools/clangpchmanagerbackend/source/pchtaskqueue.cpp index 7a6e29c584..8f1b53855a 100644 --- a/src/tools/clangpchmanagerbackend/source/pchtaskqueue.cpp +++ b/src/tools/clangpchmanagerbackend/source/pchtaskqueue.cpp @@ -26,6 +26,8 @@ #include "pchtaskqueue.h" #include <environment.h> +#include <filepathcaching.h> +#include <filesystem.h> #include <pchcreatorinterface.h> #include <precompiledheaderstorageinterface.h> #include <progresscounter.h> @@ -107,36 +109,67 @@ void PchTaskQueue::removePchTasks(const ProjectPartIds &projectsPartIds) removePchTasksByProjectPartId(projectsPartIds, m_projectPchTasks); } -void PchTaskQueue::processProjectPchTasks() +int PchTaskQueue::processProjectPchTasks() { - uint systemRunningTaskCount = m_systemPchTaskScheduler.slotUsage().used; + auto slotUsage = m_projectPchTaskScheduler.slotUsage(); + uint freeTaskCount = slotUsage.free; - if (!systemRunningTaskCount) { - uint freeTaskCount = m_projectPchTaskScheduler.slotUsage().free; + int newTaskCount = std::min<int>(int(freeTaskCount), int(m_projectPchTasks.size())); - auto newEnd = std::prev(m_projectPchTasks.end(), - std::min<int>(int(freeTaskCount), int(m_projectPchTasks.size()))); - m_projectPchTaskScheduler.addTasks(createProjectTasks( - {std::make_move_iterator(newEnd), std::make_move_iterator(m_projectPchTasks.end())})); - m_projectPchTasks.erase(newEnd, m_projectPchTasks.end()); - } + auto newEnd = std::prev(m_projectPchTasks.end(), newTaskCount); + m_projectPchTaskScheduler.addTasks(createProjectTasks( + {std::make_move_iterator(newEnd), std::make_move_iterator(m_projectPchTasks.end())})); + m_projectPchTasks.erase(newEnd, m_projectPchTasks.end()); + + return newTaskCount + slotUsage.used; } -void PchTaskQueue::processSystemPchTasks() +int PchTaskQueue::processSystemPchTasks() { - uint freeTaskCount = m_systemPchTaskScheduler.slotUsage().free; + auto slotUsage = m_systemPchTaskScheduler.slotUsage(); + uint freeTaskCount = slotUsage.free; + + int newTaskCount = std::min<int>(int(freeTaskCount), int(m_systemPchTasks.size())); - auto newEnd = std::prev(m_systemPchTasks.end(), - std::min<int>(int(freeTaskCount), int(m_systemPchTasks.size()))); + auto newEnd = std::prev(m_systemPchTasks.end(), newTaskCount); m_systemPchTaskScheduler.addTasks(createSystemTasks( {std::make_move_iterator(newEnd), std::make_move_iterator(m_systemPchTasks.end())})); m_systemPchTasks.erase(newEnd, m_systemPchTasks.end()); + + return newTaskCount + slotUsage.used; +} + +void PchTaskQueue::deleteUnusedPchs() +{ + FilePathIds existingPchFilePathIds = m_fileSystem.directoryEntries( + QString{m_environment.pchBuildDirectory()}); + FilePathIds notAnymoreUsedPchFilePathIds; + notAnymoreUsedPchFilePathIds.reserve(existingPchFilePathIds.size()); + + FilePathIds usedPchFilePathIds = m_filePathCache.filePathIds( + m_precompiledHeaderStorage.fetchAllPchPaths()); + std::sort(usedPchFilePathIds.begin(), usedPchFilePathIds.end()); + + std::set_difference(existingPchFilePathIds.begin(), + existingPchFilePathIds.end(), + usedPchFilePathIds.begin(), + usedPchFilePathIds.end(), + std::back_inserter(notAnymoreUsedPchFilePathIds)); + + m_fileSystem.remove(notAnymoreUsedPchFilePathIds); } void PchTaskQueue::processEntries() { - processSystemPchTasks(); - processProjectPchTasks(); + int projectTaskCount = 0; + int systemTaskCount = processSystemPchTasks(); + if (systemTaskCount == 0) + projectTaskCount = processProjectPchTasks(); + + int totalTaskCount = projectTaskCount + systemTaskCount; + + if (totalTaskCount == 0) + deleteUnusedPchs(); } std::vector<PchTaskQueue::Task> PchTaskQueue::createProjectTasks(PchTasks &&pchTasks) const diff --git a/src/tools/clangpchmanagerbackend/source/pchtaskqueue.h b/src/tools/clangpchmanagerbackend/source/pchtaskqueue.h index 80d96b8e85..ecb9bc5e54 100644 --- a/src/tools/clangpchmanagerbackend/source/pchtaskqueue.h +++ b/src/tools/clangpchmanagerbackend/source/pchtaskqueue.h @@ -37,6 +37,8 @@ class PchCreatorInterface; class PrecompiledHeaderStorageInterface; class ProgressCounter; class Environment; +class FileSystemInterface; +class FilePathCachingInterface; class PchTaskQueue final : public PchTaskQueueInterface { @@ -48,13 +50,17 @@ public: ProgressCounter &progressCounter, PrecompiledHeaderStorageInterface &precompiledHeaderStorage, Sqlite::TransactionInterface &transactionsInterface, - const Environment &environment) + const Environment &environment, + FileSystemInterface &fileSystem, + FilePathCachingInterface &filePathCache) : m_systemPchTaskScheduler(systemPchTaskScheduler) , m_projectPchTaskScheduler(projectPchTaskScheduler) , m_precompiledHeaderStorage(precompiledHeaderStorage) , m_transactionsInterface(transactionsInterface) , m_progressCounter(progressCounter) , m_environment(environment) + , m_fileSystem(fileSystem) + , m_filePathCache(filePathCache) {} void addSystemPchTasks(PchTasks &&pchTasks) override; @@ -72,8 +78,9 @@ public: private: void addPchTasks(PchTasks &&pchTasks, PchTasks &destination); void removePchTasksByProjectPartId(const ProjectPartIds &projectsPartIds, PchTasks &destination); - void processProjectPchTasks(); - void processSystemPchTasks(); + int processProjectPchTasks(); + int processSystemPchTasks(); + void deleteUnusedPchs(); private: PchTasks m_systemPchTasks; @@ -84,6 +91,8 @@ private: Sqlite::TransactionInterface &m_transactionsInterface; ProgressCounter &m_progressCounter; const Environment &m_environment; + FileSystemInterface &m_fileSystem; + FilePathCachingInterface &m_filePathCache; }; } // namespace ClangBackEnd diff --git a/src/tools/clangpchmanagerbackend/source/precompiledheaderstorage.h b/src/tools/clangpchmanagerbackend/source/precompiledheaderstorage.h index d781c96e52..16a6a66952 100644 --- a/src/tools/clangpchmanagerbackend/source/precompiledheaderstorage.h +++ b/src/tools/clangpchmanagerbackend/source/precompiledheaderstorage.h @@ -219,6 +219,22 @@ public: return {}; } + FilePaths fetchAllPchPaths() const + { + try { + Sqlite::DeferredTransaction transaction{database}; + + auto filePaths = fetchAllPchPathsStatement.template values<FilePath>(1024); + + transaction.commit(); + + return filePaths; + + } catch (const Sqlite::StatementIsBusy) { + return fetchAllPchPaths(); + } + } + public: Sqlite::ImmediateNonThrowingDestructorTransaction transaction; Database &database; @@ -262,6 +278,10 @@ public: "SELECT projectPchBuildTime, systemPchBuildTime FROM precompiledHeaders WHERE " "projectPartId = ?", database}; + mutable ReadStatement fetchAllPchPathsStatement{ + "SELECT DISTINCT systemPchPath FROM precompiledHeaders UNION ALL SELECT " + "DISTINCT projectPchPath FROM precompiledHeaders", + database}; }; } diff --git a/src/tools/clangpchmanagerbackend/source/precompiledheaderstorageinterface.h b/src/tools/clangpchmanagerbackend/source/precompiledheaderstorageinterface.h index 92b3604cdc..fd954a0c8a 100644 --- a/src/tools/clangpchmanagerbackend/source/precompiledheaderstorageinterface.h +++ b/src/tools/clangpchmanagerbackend/source/precompiledheaderstorageinterface.h @@ -60,6 +60,7 @@ public: virtual FilePath fetchPrecompiledHeader(ProjectPartId projectPartId) const = 0; virtual PchPaths fetchPrecompiledHeaders(ProjectPartId projectPartId) const = 0; virtual PrecompiledHeaderTimeStamps fetchTimeStamps(ProjectPartId projectPartId) const = 0; + virtual FilePaths fetchAllPchPaths() const = 0; protected: ~PrecompiledHeaderStorageInterface() = default; |