aboutsummaryrefslogtreecommitdiffstats
path: root/src/core/thread/Task.cpp
diff options
context:
space:
mode:
authorsaturneric <[email protected]>2023-10-19 10:51:20 +0000
committersaturneric <[email protected]>2023-10-19 10:51:20 +0000
commit025c268f91ee1deab17891f00dc8c90c4770224f (patch)
tree3454263c7e5d4545bc5bac624eba17ca71257654 /src/core/thread/Task.cpp
parentfeat: using pool for concurrent executions, not stable yet (diff)
downloadGpgFrontend-025c268f91ee1deab17891f00dc8c90c4770224f.tar.gz
GpgFrontend-025c268f91ee1deab17891f00dc8c90c4770224f.zip
fix: improve the stability of thread system
Diffstat (limited to 'src/core/thread/Task.cpp')
-rw-r--r--src/core/thread/Task.cpp51
1 files changed, 25 insertions, 26 deletions
diff --git a/src/core/thread/Task.cpp b/src/core/thread/Task.cpp
index bda64564..6e545d81 100644
--- a/src/core/thread/Task.cpp
+++ b/src/core/thread/Task.cpp
@@ -28,6 +28,8 @@
#include "core/thread/Task.h"
+#include <qobjectdefs.h>
+
#include <boost/stacktrace.hpp>
#include <boost/uuid/uuid.hpp>
#include <boost/uuid/uuid_generators.hpp>
@@ -49,7 +51,7 @@ class Task::Impl : public QObject {
}
Impl(Task *parent, TaskRunnable runnable, std::string name,
- DataObjectPtr data_object, bool sequency)
+ DataObjectPtr data_object)
: QObject(parent),
parent_(parent),
uuid_(generate_uuid()),
@@ -57,15 +59,14 @@ class Task::Impl : public QObject {
runnable_(std::move(runnable)),
callback_(std::move([](int, const DataObjectPtr &) {})),
callback_thread_(QThread::currentThread()),
- data_object_(data_object),
- sequency_(sequency) {
+ data_object_(data_object) {
SPDLOG_TRACE("task {} created with runnable, callback_thread_: {}",
GetFullID(), static_cast<void *>(callback_thread_));
init();
}
Impl(Task *parent, TaskRunnable runnable, std::string name,
- DataObjectPtr data_object, TaskCallback callback, bool sequency)
+ DataObjectPtr data_object, TaskCallback callback)
: QObject(parent),
parent_(parent),
uuid_(generate_uuid()),
@@ -73,8 +74,7 @@ class Task::Impl : public QObject {
runnable_(std::move(runnable)),
callback_(std::move(callback)),
callback_thread_(QThread::currentThread()),
- data_object_(data_object),
- sequency_(sequency) {
+ data_object_(data_object) {
SPDLOG_TRACE(
"task {} created with runnable and callback, callback_thread_: {}",
GetFullID(), static_cast<void *>(callback_thread_));
@@ -92,8 +92,6 @@ class Task::Impl : public QObject {
std::string GetUUID() const { return uuid_; }
- bool GetSequency() const { return sequency_; }
-
void Run() {
SPDLOG_DEBUG("task {} is using default runnable and callback mode",
GetFullID());
@@ -137,14 +135,13 @@ class Task::Impl : public QObject {
boost::stacktrace::to_string(boost::stacktrace::stacktrace()));
}
// raise signal to anounce after runnable returned
- if (parent_->autoDelete()) slot_task_run_callback(rtn_);
+ if (parent_->autoDelete()) emit parent_->SignalTaskShouldEnd(rtn_);
}
private:
Task *const parent_;
const std::string uuid_;
const std::string name_;
- const bool sequency_ = true; ///< must run in the same thread
TaskCallback callback_; ///<
TaskRunnable runnable_; ///<
int rtn_ = 0; ///<
@@ -152,14 +149,18 @@ class Task::Impl : public QObject {
DataObjectPtr data_object_ = nullptr; ///<
void init() {
+ //
+ HoldOnLifeCycle(false);
+
+ //
connect(parent_, &Task::SignalRun, this, &Task::Impl::slot_run);
//
connect(parent_, &Task::SignalTaskShouldEnd, this,
- &Impl::slot_task_run_callback);
+ &Impl::slot_task_should_end);
//
- connect(parent_, &Task::SignalTaskShouldEnd, parent_, &Task::deleteLater);
+ connect(parent_, &Task::SignalTaskEnd, parent_, &Task::deleteLater);
}
/**
@@ -177,7 +178,7 @@ class Task::Impl : public QObject {
* @brief
*
*/
- void slot_task_run_callback(int rtn) {
+ void slot_task_should_end(int rtn) {
SPDLOG_TRACE("task runnable {} finished, rtn: {}", GetFullID(), rtn);
// set return value
this->SetRTN(rtn);
@@ -218,18 +219,14 @@ class Task::Impl : public QObject {
}
};
-const std::string DEFAULT_TASK_NAME = "unnamed-task";
-
-Task::Task(std::string name) : p_(std::make_unique<Impl>(this, name)) {}
+Task::Task(std::string name) : p_(new Impl(this, name)) {}
-Task::Task(TaskRunnable runnable, std::string name, DataObjectPtr data_object,
- bool sequency)
- : p_(std::make_unique<Impl>(this, runnable, name, data_object, sequency)) {}
+Task::Task(TaskRunnable runnable, std::string name, DataObjectPtr data_object)
+ : p_(new Impl(this, runnable, name, data_object)) {}
Task::Task(TaskRunnable runnable, std::string name, DataObjectPtr data_object,
- TaskCallback callback, bool sequency)
- : p_(std::make_unique<Impl>(this, runnable, name, data_object, callback,
- sequency)) {}
+ TaskCallback callback)
+ : p_(new Impl(this, runnable, name, data_object, callback)) {}
Task::~Task() = default;
@@ -242,17 +239,19 @@ std::string Task::GetFullID() const { return p_->GetFullID(); }
std::string Task::GetUUID() const { return p_->GetUUID(); }
-bool Task::GetSequency() const { return p_->GetSequency(); }
-
void Task::HoldOnLifeCycle(bool hold_on) { p_->HoldOnLifeCycle(hold_on); }
void Task::SetRTN(int rtn) { p_->SetRTN(rtn); }
-void Task::SlotRun() { emit SignalRun(); }
+void Task::SafelyRun() { emit SignalRun(); }
void Task::Run() { p_->Run(); }
-void Task::run() { this->SlotRun(); }
+void Task::run() {
+ SPDLOG_DEBUG("interface run() of task {} was called by thread: {}",
+ GetFullID(), QThread::currentThread()->currentThreadId());
+ this->SafelyRun();
+}
} // namespace GpgFrontend::Thread