aboutsummaryrefslogtreecommitdiffstats
path: root/src/core/thread/Task.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/thread/Task.cpp')
-rw-r--r--src/core/thread/Task.cpp77
1 files changed, 36 insertions, 41 deletions
diff --git a/src/core/thread/Task.cpp b/src/core/thread/Task.cpp
index 92592bf4..a5d718ee 100644
--- a/src/core/thread/Task.cpp
+++ b/src/core/thread/Task.cpp
@@ -28,28 +28,29 @@
#include "core/thread/Task.h"
+#include <qscopedpointer.h>
+
#include <boost/stacktrace.hpp>
#include <boost/uuid/uuid.hpp>
#include <boost/uuid/uuid_generators.hpp>
#include <boost/uuid/uuid_io.hpp>
#include <utility>
-namespace GpgFrontend::Thread {
+#include "utils/MemoryUtils.h"
-class Task::Impl : public QObject {
- Q_OBJECT
+namespace GpgFrontend::Thread {
+class Task::Impl {
public:
Impl(Task *parent, std::string name)
- : QObject(parent), parent_(parent), uuid_(generate_uuid()), name_(name) {
+ : parent_(parent), uuid_(generate_uuid()), name_(name) {
SPDLOG_TRACE("task {} created", GetFullID());
init();
}
Impl(Task *parent, TaskRunnable runnable, std::string name,
DataObjectPtr data_object)
- : QObject(parent),
- parent_(parent),
+ : parent_(parent),
uuid_(generate_uuid()),
name_(std::move(name)),
runnable_(std::move(runnable)),
@@ -63,8 +64,7 @@ class Task::Impl : public QObject {
Impl(Task *parent, TaskRunnable runnable, std::string name,
DataObjectPtr data_object, TaskCallback callback)
- : QObject(parent),
- parent_(parent),
+ : parent_(parent),
uuid_(generate_uuid()),
name_(std::move(name)),
runnable_(std::move(runnable)),
@@ -112,28 +112,6 @@ class Task::Impl : public QObject {
*/
void SetRTN(int rtn) { this->rtn_ = rtn; }
- private slots:
-
- /**
- * @brief
- *
- */
- void slot_run() {
- try {
- SPDLOG_TRACE("task {} is starting...", GetFullID());
- // Run() will set rtn by itself
- parent_->Run();
- SPDLOG_TRACE("task {} was end.", GetFullID());
- } catch (std::exception &e) {
- SPDLOG_ERROR("exception was caught at task: {}", e.what());
- SPDLOG_ERROR(
- "stacktrace of the exception: {}",
- boost::stacktrace::to_string(boost::stacktrace::stacktrace()));
- }
- // raise signal to anounce after runnable returned
- if (parent_->autoDelete()) emit parent_->SignalTaskShouldEnd(rtn_);
- }
-
private:
Task *const parent_;
const std::string uuid_;
@@ -152,11 +130,11 @@ class Task::Impl : public QObject {
HoldOnLifeCycle(false);
//
- connect(parent_, &Task::SignalRun, this, &Task::Impl::slot_run);
+ connect(parent_, &Task::SignalRun, [=]() { inner_run(); });
//
- connect(parent_, &Task::SignalTaskShouldEnd, this,
- &Impl::slot_task_should_end);
+ connect(parent_, &Task::SignalTaskShouldEnd,
+ [=](int rtn) { slot_task_should_end(rtn); });
//
connect(parent_, &Task::SignalTaskEnd, parent_, &Task::deleteLater);
@@ -165,14 +143,32 @@ class Task::Impl : public QObject {
/**
* @brief
*
+ */
+ void inner_run() {
+ try {
+ SPDLOG_TRACE("task {} is starting...", GetFullID());
+ // Run() will set rtn by itself
+ parent_->Run();
+ SPDLOG_TRACE("task {} was end.", GetFullID());
+ } catch (std::exception &e) {
+ SPDLOG_ERROR("exception was caught at task: {}", e.what());
+ SPDLOG_ERROR(
+ "stacktrace of the exception: {}",
+ boost::stacktrace::to_string(boost::stacktrace::stacktrace()));
+ }
+ // raise signal to anounce after runnable returned
+ if (parent_->autoDelete()) emit parent_->SignalTaskShouldEnd(rtn_);
+ }
+
+ /**
+ * @brief
+ *
* @return std::string
*/
- std::string generate_uuid() {
+ static auto generate_uuid() -> std::string {
return boost::uuids::to_string(boost::uuids::random_generator()());
}
- private slots:
-
/**
* @brief
*
@@ -265,11 +261,12 @@ class Task::Impl : public QObject {
Task::Task(std::string name) : p_(new Impl(this, name)) {}
Task::Task(TaskRunnable runnable, std::string name, DataObjectPtr data_object)
- : p_(new Impl(this, runnable, name, data_object)) {}
+ : p_(SecureCreateUniqueObject<Impl>(this, runnable, name, data_object)) {}
Task::Task(TaskRunnable runnable, std::string name, DataObjectPtr data_object,
TaskCallback callback)
- : p_(new Impl(this, runnable, name, data_object, callback)) {}
+ : p_(SecureCreateUniqueObject<Impl>(this, runnable, name, data_object,
+ callback)) {}
Task::~Task() = default;
@@ -296,6 +293,4 @@ void Task::run() {
this->SafelyRun();
}
-} // namespace GpgFrontend::Thread
-
-#include "Task.moc" \ No newline at end of file
+} // namespace GpgFrontend::Thread \ No newline at end of file