Refactored template class for synchronised resources
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user