Refactored template class for synchronised resources

This commit is contained in:
Nav
2023-06-02 00:16:58 +01:00
parent 10611d3ad3
commit 80cf6930cc
9 changed files with 146 additions and 135 deletions

View File

@@ -36,26 +36,21 @@ namespace Bloom
void InsightWorker::queueTask(const QSharedPointer<InsightWorkerTask>& task) {
task->moveToThread(nullptr);
{
const auto taskQueueLock = InsightWorker::queuedTasksById.acquireLock();
InsightWorker::queuedTasksById.getValue().emplace(task->id, task);
}
InsightWorker::queuedTasksById.accessor()->emplace(task->id, task);
emit InsightSignals::instance()->taskQueued(task);
}
void InsightWorker::executeTasks() {
static const auto getQueuedTask = [] () -> std::optional<QSharedPointer<InsightWorkerTask>> {
const auto taskQueueLock = InsightWorker::queuedTasksById.acquireLock();
auto& queuedTasks = InsightWorker::queuedTasksById.getValue();
auto queuedTasks = InsightWorker::queuedTasksById.accessor();
if (!queuedTasks.empty()) {
const auto taskGroupsLock = InsightWorker::taskGroupsInExecution.acquireLock();
auto& taskGroupsInExecution = InsightWorker::taskGroupsInExecution.getValue();
if (!queuedTasks->empty()) {
auto taskGroupsInExecution = InsightWorker::taskGroupsInExecution.accessor();
const auto canExecuteTask = [&taskGroupsInExecution] (const QSharedPointer<InsightWorkerTask>& task) {
for (const auto taskGroup : task->taskGroups()) {
if (taskGroupsInExecution.contains(taskGroup)) {
if (taskGroupsInExecution->contains(taskGroup)) {
return false;
}
}
@@ -63,11 +58,11 @@ namespace Bloom
return true;
};
for (auto [queuedTaskId, task] : queuedTasks) {
for (auto [queuedTaskId, task] : *queuedTasks) {
if (canExecuteTask(task)) {
const auto taskGroups = task->taskGroups();
taskGroupsInExecution.insert(taskGroups.begin(), taskGroups.end());
queuedTasks.erase(queuedTaskId);
taskGroupsInExecution->insert(taskGroups.begin(), taskGroups.end());
queuedTasks->erase(queuedTaskId);
return task;
}
}
@@ -84,11 +79,10 @@ namespace Bloom
task->execute(this->targetControllerService);
{
const auto taskGroupsLock = InsightWorker::taskGroupsInExecution.acquireLock();
auto& taskGroupsInExecution = InsightWorker::taskGroupsInExecution.getValue();
auto taskGroupsInExecution = InsightWorker::taskGroupsInExecution.accessor();
for (const auto& taskGroup : task->taskGroups()) {
taskGroupsInExecution.erase(taskGroup);
taskGroupsInExecution->erase(taskGroup);
}
}

View File

@@ -9,7 +9,7 @@
#include "Tasks/InsightWorkerTask.hpp"
#include "src/Helpers/SyncSafe.hpp"
#include "src/Helpers/Synchronised.hpp"
#include "src/Services/TargetControllerService.hpp"
namespace Bloom
@@ -36,8 +36,8 @@ namespace Bloom
private:
static inline std::atomic<std::uint8_t> lastWorkerId = 0;
static inline SyncSafe<std::map<InsightWorkerTask::IdType, QSharedPointer<InsightWorkerTask>>> queuedTasksById = {};
static inline SyncSafe<TaskGroups> taskGroupsInExecution = {};
static inline Synchronised<std::map<InsightWorkerTask::IdType, QSharedPointer<InsightWorkerTask>>> queuedTasksById = {};
static inline Synchronised<TaskGroups> taskGroupsInExecution = {};
Services::TargetControllerService targetControllerService = Services::TargetControllerService();