From 3db6228dfc65a25da49bab26ab8bcf4abc69a98f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o=20Lam?= Date: Tue, 15 Sep 2020 19:13:52 +0200 Subject: ksys: Add more task utilities * TaskMgr, ManagedTask, ManagedTaskHandle * GameTaskThread: partial implementation because PhysicsMemSys / Havok stuff hasn't been decompiled yet and calc_() requires PhysicsMemSys --- src/KingSystem/Utils/Thread/ManagedTask.cpp | 106 ++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 src/KingSystem/Utils/Thread/ManagedTask.cpp (limited to 'src/KingSystem/Utils/Thread/ManagedTask.cpp') 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 -- cgit v1.2.3