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/ManagedTaskHandle.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/ManagedTaskHandle.cpp')
| -rw-r--r-- | src/KingSystem/Utils/Thread/ManagedTaskHandle.cpp | 107 |
1 files changed, 107 insertions, 0 deletions
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 |
