2021-08-30 22:17:59 +01:00
|
|
|
#include "InsightWorker.hpp"
|
|
|
|
|
|
2021-04-04 21:04:12 +01:00
|
|
|
#include <QObject>
|
2022-04-27 21:27:59 +01:00
|
|
|
|
2022-09-07 22:25:28 +01:00
|
|
|
#include "src/Insight/InsightSignals.hpp"
|
2021-08-30 22:17:59 +01:00
|
|
|
#include "src/Logger/Logger.hpp"
|
2021-04-04 21:04:12 +01:00
|
|
|
|
2022-02-05 15:32:08 +00:00
|
|
|
namespace Bloom
|
|
|
|
|
{
|
|
|
|
|
using namespace Bloom::Exceptions;
|
2021-05-24 20:58:49 +01:00
|
|
|
|
2022-02-05 15:32:08 +00:00
|
|
|
using Bloom::Targets::TargetState;
|
2021-04-04 21:04:12 +01:00
|
|
|
|
2022-02-05 15:32:08 +00:00
|
|
|
void InsightWorker::startup() {
|
2022-09-08 19:54:37 +01:00
|
|
|
auto* insightSignals = InsightSignals::instance();
|
|
|
|
|
|
2022-09-17 20:18:03 +01:00
|
|
|
QObject::connect(
|
|
|
|
|
insightSignals,
|
|
|
|
|
&InsightSignals::taskQueued,
|
|
|
|
|
this,
|
|
|
|
|
&InsightWorker::executeTasks,
|
|
|
|
|
Qt::ConnectionType::QueuedConnection
|
|
|
|
|
);
|
|
|
|
|
QObject::connect(
|
|
|
|
|
insightSignals,
|
|
|
|
|
&InsightSignals::taskProcessed,
|
|
|
|
|
this,
|
|
|
|
|
&InsightWorker::executeTasks,
|
|
|
|
|
Qt::ConnectionType::QueuedConnection
|
|
|
|
|
);
|
2021-10-18 01:03:22 +01:00
|
|
|
|
2022-09-14 19:46:16 +01:00
|
|
|
Logger::debug("InsightWorker" + std::to_string(this->id) + " ready");
|
2022-02-05 15:32:08 +00:00
|
|
|
emit this->ready();
|
|
|
|
|
}
|
2021-08-30 22:17:59 +01:00
|
|
|
|
2023-03-13 00:45:26 +00:00
|
|
|
void InsightWorker::queueTask(const QSharedPointer<InsightWorkerTask>& task) {
|
|
|
|
|
task->moveToThread(nullptr);
|
2021-04-04 21:04:12 +01:00
|
|
|
|
2023-06-02 00:16:58 +01:00
|
|
|
InsightWorker::queuedTasksById.accessor()->emplace(task->id, task);
|
2022-04-23 17:30:14 +01:00
|
|
|
|
2023-03-13 00:45:26 +00:00
|
|
|
emit InsightSignals::instance()->taskQueued(task);
|
2022-02-05 15:32:08 +00:00
|
|
|
}
|
2021-05-30 16:53:24 +01:00
|
|
|
|
2022-09-08 19:54:37 +01:00
|
|
|
void InsightWorker::executeTasks() {
|
2023-03-12 23:31:19 +00:00
|
|
|
static const auto getQueuedTask = [] () -> std::optional<QSharedPointer<InsightWorkerTask>> {
|
2023-06-02 00:16:58 +01:00
|
|
|
auto queuedTasks = InsightWorker::queuedTasksById.accessor();
|
2022-02-05 15:32:08 +00:00
|
|
|
|
2023-06-02 00:16:58 +01:00
|
|
|
if (!queuedTasks->empty()) {
|
|
|
|
|
auto taskGroupsInExecution = InsightWorker::taskGroupsInExecution.accessor();
|
2021-10-06 21:12:31 +01:00
|
|
|
|
2023-03-12 23:31:19 +00:00
|
|
|
const auto canExecuteTask = [&taskGroupsInExecution] (const QSharedPointer<InsightWorkerTask>& task) {
|
2023-03-15 20:15:05 +00:00
|
|
|
for (const auto taskGroup : task->taskGroups()) {
|
2023-06-02 00:16:58 +01:00
|
|
|
if (taskGroupsInExecution->contains(taskGroup)) {
|
2022-09-08 19:54:37 +01:00
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
};
|
|
|
|
|
|
2023-06-02 00:16:58 +01:00
|
|
|
for (auto [queuedTaskId, task] : *queuedTasks) {
|
2022-09-08 19:54:37 +01:00
|
|
|
if (canExecuteTask(task)) {
|
2023-03-15 20:15:05 +00:00
|
|
|
const auto taskGroups = task->taskGroups();
|
2023-06-02 00:16:58 +01:00
|
|
|
taskGroupsInExecution->insert(taskGroups.begin(), taskGroups.end());
|
|
|
|
|
queuedTasks->erase(queuedTaskId);
|
2022-09-08 19:54:37 +01:00
|
|
|
return task;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return std::nullopt;
|
|
|
|
|
};
|
2022-06-05 17:00:56 +01:00
|
|
|
|
2023-03-12 23:31:19 +00:00
|
|
|
auto queuedTask = std::optional<QSharedPointer<InsightWorkerTask>>();
|
2022-09-07 22:25:28 +01:00
|
|
|
|
2022-09-08 19:54:37 +01:00
|
|
|
while ((queuedTask = getQueuedTask())) {
|
2023-03-12 23:31:19 +00:00
|
|
|
auto& task = *queuedTask;
|
2022-09-07 22:25:28 +01:00
|
|
|
task->moveToThread(this->thread());
|
2022-12-26 21:27:19 +00:00
|
|
|
task->execute(this->targetControllerService);
|
2022-09-08 19:54:37 +01:00
|
|
|
|
|
|
|
|
{
|
2023-06-02 00:16:58 +01:00
|
|
|
auto taskGroupsInExecution = InsightWorker::taskGroupsInExecution.accessor();
|
2022-09-08 19:54:37 +01:00
|
|
|
|
2023-03-15 20:15:05 +00:00
|
|
|
for (const auto& taskGroup : task->taskGroups()) {
|
2023-06-02 00:16:58 +01:00
|
|
|
taskGroupsInExecution->erase(taskGroup);
|
2022-09-08 19:54:37 +01:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-03-12 23:31:19 +00:00
|
|
|
emit InsightSignals::instance()->taskProcessed(task);
|
2022-02-05 15:32:08 +00:00
|
|
|
}
|
2021-10-06 21:12:31 +01:00
|
|
|
}
|
|
|
|
|
}
|