diff options
author | Saturneric <[email protected]> | 2022-05-20 18:10:06 +0000 |
---|---|---|
committer | Saturneric <[email protected]> | 2022-05-20 18:10:06 +0000 |
commit | 7d5a4bed7fc1c78f9be897daf4f2f50fad51f828 (patch) | |
tree | cd683b43005de0cc0fdb03733a946a72e74b6447 /src/core/thread/TaskRunner.cpp | |
parent | fix: improve about dialog about version checking (diff) | |
download | GpgFrontend-7d5a4bed7fc1c78f9be897daf4f2f50fad51f828.tar.gz GpgFrontend-7d5a4bed7fc1c78f9be897daf4f2f50fad51f828.zip |
feat: track pending tasks in task runner system
Diffstat (limited to 'src/core/thread/TaskRunner.cpp')
-rw-r--r-- | src/core/thread/TaskRunner.cpp | 29 |
1 files changed, 25 insertions, 4 deletions
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<std::mutex> 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<std::mutex> 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()); } } } |