mirror of
https://github.com/zeldaret/botw
synced 2026-05-28 08:25:01 -04:00
3db6228dfc
* TaskMgr, ManagedTask, ManagedTaskHandle * GameTaskThread: partial implementation because PhysicsMemSys / Havok stuff hasn't been decompiled yet and calc_() requires PhysicsMemSys
107 lines
2.3 KiB
C++
107 lines
2.3 KiB
C++
#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
|