summaryrefslogtreecommitdiff
path: root/src/KingSystem/Utils/Thread/ManagedTaskHandle.cpp
diff options
context:
space:
mode:
authorLéo Lam <leo@leolam.fr>2020-09-15 19:13:52 +0200
committerLéo Lam <leo@leolam.fr>2020-09-16 17:49:37 +0200
commit3db6228dfc65a25da49bab26ab8bcf4abc69a98f (patch)
tree3946a9211c2adc7213b1ae94ccf4baca22b73020 /src/KingSystem/Utils/Thread/ManagedTaskHandle.cpp
parent8b7369dffb1e816b2f27ab0133d2bac218383a45 (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.cpp107
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