aboutsummaryrefslogtreecommitdiffstats
path: root/src/core/thread/Task.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/thread/Task.h')
-rw-r--r--src/core/thread/Task.h223
1 files changed, 50 insertions, 173 deletions
diff --git a/src/core/thread/Task.h b/src/core/thread/Task.h
index ce354697..97a14949 100644
--- a/src/core/thread/Task.h
+++ b/src/core/thread/Task.h
@@ -1,5 +1,5 @@
/**
- * Copyright (C) 2021 Saturneric
+ * Copyright (C) 2021 Saturneric <[email protected]>
*
* This file is part of GpgFrontend.
*
@@ -20,23 +20,17 @@
* the gpg4usb project, which is under GPL-3.0-or-later.
*
* All the source code of GpgFrontend was modified and released by
- * Saturneric<[email protected]> starting on May 12, 2021.
+ * Saturneric <[email protected]> starting on May 12, 2021.
*
* SPDX-License-Identifier: GPL-3.0-or-later
*
*/
-#ifndef GPGFRONTEND_TASK_H
-#define GPGFRONTEND_TASK_H
-
-#include <functional>
-#include <memory>
-#include <stack>
-#include <string>
-#include <type_traits>
-#include <utility>
+#pragma once
#include "core/GpgFrontendCore.h"
+#include "core/function/SecureMemoryAllocator.h"
+#include "core/model/DataObject.h"
namespace GpgFrontend::Thread {
@@ -45,253 +39,136 @@ class TaskRunner;
class GPGFRONTEND_CORE_EXPORT Task : public QObject, public QRunnable {
Q_OBJECT
public:
- class DataObject;
- using DataObjectPtr = std::shared_ptr<DataObject>; ///<
+ friend class TaskRunner;
+
using TaskRunnable = std::function<int(DataObjectPtr)>; ///<
using TaskCallback = std::function<void(int, DataObjectPtr)>; ///<
- static const std::string DEFAULT_TASK_NAME;
-
- friend class TaskRunner;
-
- /**
- * @brief DataObject to be passed to the callback function.
- *
- */
- class GPGFRONTEND_CORE_EXPORT DataObject {
+ class TaskHandler {
public:
- struct Destructor {
- const void *p_obj;
- void (*destroy)(const void *);
- };
-
- /**
- * @brief Get the Objects Size
- *
- * @return size_t
- */
- size_t GetObjectSize();
-
- /**
- * @brief
- *
- * @tparam T
- * @param ptr
- */
- template <typename T>
- void AppendObject(T &&obj) {
- SPDLOG_TRACE("append object: {}", static_cast<void *>(this));
- auto *obj_dstr = this->get_heap_ptr(sizeof(T));
- new ((void *)obj_dstr->p_obj) T(std::forward<T>(obj));
+ explicit TaskHandler(Task*);
- if (std::is_class_v<T>) {
- auto destructor = [](const void *x) {
- static_cast<const T *>(x)->~T();
- };
- obj_dstr->destroy = destructor;
- } else {
- obj_dstr->destroy = nullptr;
- }
+ void Start();
- data_objects_.push(obj_dstr);
- }
+ void Cancel();
- /**
- * @brief
- *
- * @tparam T
- * @param ptr
- */
- template <typename T>
- void AppendObject(T *obj) {
- SPDLOG_TRACE("called: {}", static_cast<void *>(this));
- auto *obj_dstr = this->get_heap_ptr(sizeof(T));
- auto *ptr_heap = new ((void *)obj_dstr->p_obj) T(std::move(*obj));
- if (std::is_class_v<T>) {
- SPDLOG_TRACE("is class");
- auto destructor = [](const void *x) {
- static_cast<const T *>(x)->~T();
- };
- obj_dstr->destroy = destructor;
- } else {
- obj_dstr->destroy = nullptr;
- }
- data_objects_.push(std::move(obj_dstr));
- }
-
- /**
- * @brief
- *
- * @tparam T
- * @return std::shared_ptr<T>
- */
- template <typename T>
- T PopObject() {
- SPDLOG_TRACE("pop object: {}", static_cast<void *>(this));
- if (data_objects_.empty()) throw std::runtime_error("No object to pop");
- auto *obj_dstr = data_objects_.top();
- auto *heap_ptr = (T *)obj_dstr->p_obj;
- auto obj = std::move(*(T *)(heap_ptr));
- this->free_heap_ptr(obj_dstr);
- data_objects_.pop();
- return obj;
- }
-
- /**
- * @brief Destroy the Data Object object
- *
- */
- ~DataObject();
+ auto GetTask() -> Task*;
private:
- std::stack<Destructor *> data_objects_; ///<
-
- /**
- * @brief Get the heap ptr object
- *
- * @param bytes_size
- * @return void*
- */
- Destructor *get_heap_ptr(size_t bytes_size);
-
- /**
- * @brief
- *
- * @param heap_ptr
- */
- void free_heap_ptr(Destructor *);
+ QPointer<Task> task_;
};
/**
* @brief Construct a new Task object
*
*/
- Task(std::string name = DEFAULT_TASK_NAME);
+ explicit Task(QString name);
/**
* @brief Construct a new Task object
*
* @param callback The callback function to be executed.
*/
- explicit Task(TaskRunnable runnable, std::string name = DEFAULT_TASK_NAME,
- DataObjectPtr data_object = nullptr, bool sequency = true);
+ explicit Task(TaskRunnable runnable, QString name,
+ DataObjectPtr data_object = nullptr);
/**
* @brief Construct a new Task object
*
* @param runnable
*/
- explicit Task(
- TaskRunnable runnable, std::string name, DataObjectPtr data,
- TaskCallback callback = [](int, const std::shared_ptr<DataObject> &) {},
- bool sequency = true);
+ explicit Task(TaskRunnable runnable, QString name, DataObjectPtr data,
+ TaskCallback callback);
/**
* @brief Destroy the Task object
*
*/
- virtual ~Task() override;
+ ~Task() override;
/**
- * @brief Run - run the task
+ * @brief
*
+ * @return QString
*/
- virtual void Run();
+ [[nodiscard]] auto GetUUID() const -> QString;
/**
- * @brief
+ * @brief Get the Full I D object
*
- * @return std::string
+ * @return QString
*/
- std::string GetUUID() const;
+ [[nodiscard]] auto GetFullID() const -> QString;
/**
* @brief
*
- * @return std::string
+ * @param hold_on
*/
- std::string GetFullID() const;
+ void HoldOnLifeCycle(bool hold_on);
/**
- * @brief
+ * @brief can be overwrite by subclass
*
- * @return std::string
+ * @return int
*/
- bool GetSequency() const;
-
- public slots:
+ virtual auto Run() -> int;
/**
* @brief
*
+ * @return auto
*/
- void SlotRun();
+ [[nodiscard]] auto GetRTN();
- signals:
- /**
- * @brief announce runnable finished
- *
- */
- void SignalTaskRunnableEnd(int rtn);
+ public slots:
/**
- * @brief runnable and callabck all finished
+ * @brief shouldn't be overwrite by subclass
*
*/
- void SignalTaskEnd();
+ void SafelyRun();
- protected:
- /**
- * @brief Set the Finish After Run object
- *
- * @param finish_after_run
- */
- void SetFinishAfterRun(bool finish_after_run);
+ signals:
/**
* @brief
*
- * @param rtn
*/
- void SetRTN(int rtn);
-
- private:
- const std::string uuid_;
- const std::string name_;
- const bool sequency_ = true; ///< must run in the same thread
- TaskCallback callback_; ///<
- TaskRunnable runnable_; ///<
- bool run_callback_after_runnable_finished_ = true; ///<
- int rtn_ = 0; ///<
- QThread *callback_thread_ = nullptr; ///<
- DataObjectPtr data_object_ = nullptr; ///<
+ void SignalRun();
/**
* @brief
*
*/
- void init();
+ void SignalTaskShouldEnd(int);
/**
* @brief
*
*/
- virtual void run() override;
+ void SignalTaskEnd();
+ protected:
/**
* @brief
*
- * @return std::string
+ * @param rtn
*/
- static std::string generate_uuid();
+ void setRTN(int rtn);
private slots:
+
/**
* @brief
*
*/
- void slot_task_run_callback(int rtn);
+ void slot_exception_safe_run() noexcept;
+
+ private:
+ class Impl;
+ SecureUniquePtr<Impl> p_;
+
+ void run() override;
};
} // namespace GpgFrontend::Thread
-
-#endif // GPGFRONTEND_TASK_H \ No newline at end of file