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/ManagedTaskHandle.cpp | 107 ++++++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 src/KingSystem/Utils/Thread/ManagedTaskHandle.cpp (limited to 'src/KingSystem/Utils/Thread/ManagedTaskHandle.cpp') diff --git a/src/KingSystem/Utils/Thread/ManagedTaskHandle.cpp b/src/KingSystem/Utils/Thread/ManagedTaskHandle.cpp new file mode 100644 index 00000000..874bf46f --- /dev/null +++ b/src/KingSystem/Utils/Thread/ManagedTaskHandle.cpp @@ -0,0 +1,107 @@ +#include "KingSystem/Utils/Thread/ManagedTaskHandle.h" +#include "KingSystem/Utils/Thread/ManagedTask.h" +#include "KingSystem/Utils/Thread/TaskQueueBase.h" +#include "KingSystem/Utils/Thread/TaskQueueLock.h" + +namespace ksys::util { + +ManagedTaskHandle::ManagedTaskHandle() = default; + +ManagedTaskHandle::~ManagedTaskHandle() { + removeTaskFromQueue(); + finalize(); +} + +void ManagedTaskHandle::removeTaskFromQueue() { + if (!mQueue) + return; + + incrementRef_(); + + if (mTask) + mTask->removeFromQueue(); + + decrementRef_(); +} + +void ManagedTaskHandle::finalize() { + if (mQueue) + decrementRef_(); +} + +bool ManagedTaskHandle::hasTask() const { + return mTask != nullptr; +} + +bool ManagedTaskHandle::wait() { + if (!mQueue) + return true; + + incrementRef_(); + + if (mTask) + mTask->wait(); + + decrementRef_(); + return true; +} + +bool ManagedTaskHandle::wait(const sead::TickSpan& wait_duration) { + if (!mQueue) + return true; + + incrementRef_(); + + if (!mTask) { + decrementRef_(); + return true; + } + + const bool ret = mTask->wait(wait_duration); + decrementRef_(); + return ret; +} + +bool ManagedTaskHandle::isTaskAttached() const { + return mTask && mStatus == Status::TaskAttached; +} + +bool ManagedTaskHandle::didTaskCompleteSuccessfully() const { + return mStatus == Status::TaskFinished && mSuccess; +} + +bool ManagedTaskHandle::attachTask(const SetTaskArg& arg) { + mTask = arg.task; + mQueue = arg.queue; + incrementRef_(); + return true; +} + +void ManagedTaskHandle::setStatus(Status status) { + mStatus = status; +} + +void ManagedTaskHandle::setIsSuccess(bool success) { + mSuccess = success; +} + +inline void ManagedTaskHandle::incrementRef_() { + TaskQueueLock lock; + mQueue->lock(&lock); + ++mRefCount; +} + +inline void ManagedTaskHandle::decrementRef_() { + TaskQueueLock lock; + mQueue->lock(&lock); + + if (mRefCount > 0) + --mRefCount; + + if (mRefCount <= 0 && mTask) { + mTask->detachHandle(); + mTask = nullptr; + } +} + +} // namespace ksys::util -- cgit v1.2.3