summaryrefslogtreecommitdiff
path: root/src/tools
diff options
context:
space:
mode:
Diffstat (limited to 'src/tools')
-rw-r--r--src/tools/clangpchmanagerbackend/clangpchmanagerbackendmain.cpp4
-rw-r--r--src/tools/clangpchmanagerbackend/source/pchtaskqueue.cpp65
-rw-r--r--src/tools/clangpchmanagerbackend/source/pchtaskqueue.h15
-rw-r--r--src/tools/clangpchmanagerbackend/source/precompiledheaderstorage.h20
-rw-r--r--src/tools/clangpchmanagerbackend/source/precompiledheaderstorageinterface.h1
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;