summaryrefslogtreecommitdiff
path: root/src/KingSystem/Utils/Thread/ManagedTask.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/KingSystem/Utils/Thread/ManagedTask.cpp')
-rw-r--r--src/KingSystem/Utils/Thread/ManagedTask.cpp106
1 files changed, 106 insertions, 0 deletions
diff --git a/src/KingSystem/Utils/Thread/ManagedTask.cpp b/src/KingSystem/Utils/Thread/ManagedTask.cpp
new file mode 100644
index 00000000..8a0f3dfd
--- /dev/null
+++ b/src/KingSystem/Utils/Thread/ManagedTask.cpp
@@ -0,0 +1,106 @@
+#include "KingSystem/Utils/Thread/ManagedTask.h"
+#include "KingSystem/Utils/Thread/ManagedTaskHandle.h"
+#include "KingSystem/Utils/Thread/TaskMgr.h"
+#include "KingSystem/Utils/Thread/TaskQueueLock.h"
+
+namespace ksys::util {
+
+ManagedTask::ManagedTask(sead::Heap* heap) : Task(heap) {}
+
+ManagedTask::ManagedTask(sead::IDisposer::HeapNullOption heap_null_option)
+ : Task(nullptr, heap_null_option) {}
+
+ManagedTask::~ManagedTask() {
+ if (mHandle) {
+ mHandle->finalize();
+ mHandle = nullptr;
+ }
+ finalize_();
+}
+
+void ManagedTask::prepare_(TaskRequest* request) {
+ mIsIdle = false;
+ prepareImpl_(request);
+}
+
+void ManagedTask::run_() {
+ Task::run_();
+ onRun_();
+}
+
+void ManagedTask::onRunFinished_() {}
+
+void ManagedTask::onFinish_() {
+ if (auto* handle = mHandle) {
+ handle->setIsSuccess(isSuccess());
+ handle->setStatus(ManagedTaskHandle::Status::TaskFinished);
+ }
+
+ if (!mHandle && mMgr)
+ mMgr->freeTask(this);
+}
+
+void ManagedTask::onPostFinish_() {
+ mIsIdle = true;
+}
+
+void ManagedTask::preRemove_() {
+ preRemoveImpl_();
+
+ if (mHandle)
+ mHandle->setStatus(ManagedTaskHandle::Status::TaskRemoved);
+
+ if (!mHandle && mMgr)
+ mMgr->freeTask(this);
+}
+
+void ManagedTask::postRemove_() {
+ mIsIdle = true;
+}
+
+void ManagedTask::onRun_() {}
+
+void ManagedTask::prepareImpl_(TaskRequest*) {}
+
+void ManagedTask::preRemoveImpl_() {}
+
+bool ManagedTask::isIdle() const {
+ return mIsIdle;
+}
+
+void ManagedTask::setMgr(TaskMgr* mgr) {
+ mMgr = mgr;
+}
+
+void ManagedTask::attachHandle(ManagedTaskHandle* handle, TaskQueueBase* queue) {
+ if (mHandle)
+ return;
+
+ if (handle) {
+ handle->attachTask({this, queue});
+ handle->setStatus(ManagedTaskHandle::Status::TaskAttached);
+ }
+ mHandle = handle;
+}
+
+// NON_MATCHING: switch
+void ManagedTask::detachHandle() {
+ TaskQueueLock lock;
+ lock.lock(mQueue);
+
+ if (mHandle) {
+ switch (mHandle->getStatus()) {
+ case ManagedTaskHandle::Status::TaskRemoved:
+ case ManagedTaskHandle::Status::TaskFinished:
+ mHandle = nullptr;
+ if (mMgr)
+ mMgr->freeTask(this);
+ break;
+ default:
+ mHandle = nullptr;
+ break;
+ }
+ }
+}
+
+} // namespace ksys::util