diff options
| author | Léo Lam <leo@leolam.fr> | 2020-09-15 19:13:52 +0200 |
|---|---|---|
| committer | Léo Lam <leo@leolam.fr> | 2020-09-16 17:49:37 +0200 |
| commit | 3db6228dfc65a25da49bab26ab8bcf4abc69a98f (patch) | |
| tree | 3946a9211c2adc7213b1ae94ccf4baca22b73020 /src/KingSystem/Utils/Thread/ManagedTask.cpp | |
| parent | 8b7369dffb1e816b2f27ab0133d2bac218383a45 (diff) | |
ksys: Add more task utilities
* TaskMgr, ManagedTask, ManagedTaskHandle
* GameTaskThread: partial implementation because PhysicsMemSys / Havok
stuff hasn't been decompiled yet and calc_() requires PhysicsMemSys
Diffstat (limited to 'src/KingSystem/Utils/Thread/ManagedTask.cpp')
| -rw-r--r-- | src/KingSystem/Utils/Thread/ManagedTask.cpp | 106 |
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 |
