From 7d5a4bed7fc1c78f9be897daf4f2f50fad51f828 Mon Sep 17 00:00:00 2001 From: Saturneric Date: Sat, 21 May 2022 02:10:06 +0800 Subject: feat: track pending tasks in task runner system --- src/core/thread/TaskRunner.cpp | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) (limited to 'src/core/thread/TaskRunner.cpp') diff --git a/src/core/thread/TaskRunner.cpp b/src/core/thread/TaskRunner.cpp index 226aec0e..7116ca71 100644 --- a/src/core/thread/TaskRunner.cpp +++ b/src/core/thread/TaskRunner.cpp @@ -36,12 +36,23 @@ GpgFrontend::Thread::TaskRunner::TaskRunner() = default; GpgFrontend::Thread::TaskRunner::~TaskRunner() = default; void GpgFrontend::Thread::TaskRunner::PostTask(Task* task) { - LOG(TRACE) << "called" - << "Post Task" << task->GetUUID(); + LOG(TRACE) << "Post Task" << task->GetUUID(); if (task == nullptr) return; task->setParent(nullptr); task->moveToThread(this); + + connect(task, &Task::SignalTaskPostFinishedDone, this, [=]() { + auto it = pending_tasks_.find(task->GetUUID()); + if (it == pending_tasks_.end()) { + LOG(ERROR) << "Task" << task->GetUUID() << "not found in pending tasks"; + return; + } else { + LOG(TRACE) << "Task" << task->GetUUID() << "found in pending tasks"; + it->second->deleteLater(); + pending_tasks_.erase(it); + } + }); { std::lock_guard lock(tasks_mutex_); tasks.push(task); @@ -53,17 +64,19 @@ void GpgFrontend::Thread::TaskRunner::run() { LOG(TRACE) << "called" << "thread id:" << QThread::currentThreadId(); while (true) { + LOG(TRACE) << "TaskRunner: A new cycle start"; if (tasks.empty()) { - LOG(TRACE) << "TaskRunner: No tasks to run."; + LOG(TRACE) << "TaskRunner: No tasks to run, trapping into event loop..."; exec(); } else { - LOG(TRACE) << "TaskRunner: Queue size:" << tasks.size(); + LOG(TRACE) << "TaskRunner: Task queue size:" << tasks.size(); Task* task = nullptr; { std::lock_guard lock(tasks_mutex_); task = std::move(tasks.front()); tasks.pop(); + pending_tasks_.insert({task->GetUUID(), task}); } if (task != nullptr) { @@ -74,9 +87,17 @@ void GpgFrontend::Thread::TaskRunner::run() { } catch (const std::exception& e) { LOG(ERROR) << "TaskRunner: Exception in Task" << task->GetUUID() << "Exception: " << e.what(); + + // destroy the task, remove the task from the pending tasks + task->deleteLater(); + pending_tasks_.erase(task->GetUUID()); } catch (...) { LOG(ERROR) << "TaskRunner: Unknwon Exception in Task" << task->GetUUID(); + + // destroy the task, remove the task from the pending tasks + task->deleteLater(); + pending_tasks_.erase(task->GetUUID()); } } } -- cgit v1.2.3