mirror of
https://github.com/zeldaret/botw
synced 2026-05-28 08:25:01 -04:00
ksys: Add more task utilities
* TaskMgr, ManagedTask, ManagedTaskHandle * GameTaskThread: partial implementation because PhysicsMemSys / Havok stuff hasn't been decompiled yet and calc_() requires PhysicsMemSys
This commit is contained in:
@@ -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
|
||||
Reference in New Issue
Block a user