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,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
|
||||
Reference in New Issue
Block a user