aboutsummaryrefslogtreecommitdiffstats
path: root/src/core/thread/TaskRunner.cpp
diff options
context:
space:
mode:
authorSaturneric <[email protected]>2022-05-20 18:10:06 +0000
committerSaturneric <[email protected]>2022-05-20 18:10:06 +0000
commit7d5a4bed7fc1c78f9be897daf4f2f50fad51f828 (patch)
treecd683b43005de0cc0fdb03733a946a72e74b6447 /src/core/thread/TaskRunner.cpp
parentfix: improve about dialog about version checking (diff)
downloadGpgFrontend-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.cpp29
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());
}
}
}