diff --git a/data/uking_functions.csv b/data/uking_functions.csv index 117f8bb3..5d11fee2 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -60836,11 +60836,11 @@ 0x0000007100a6d978,sub_7100A6D978,16, 0x0000007100a6d988,uiLowPrioThreadMgr::__auto0,16, 0x0000007100a6d998,sub_7100A6D998,16, -0x0000007100a6d9a8,EventPlusStringDerived::make,60, -0x0000007100a6d9e4,WorkerThreadDelegate::invoke,48, -0x0000007100a6da14,WorkerThreadDelegate::clone,92, -0x0000007100a6da70,WorkerThreadDelegateBase::return1,8, -0x0000007100a6da78,WorkerThreadDelegateBase::clone,8, +0x0000007100a6d9a8,EventPlusStringDerived::make,60,_ZN4ksys4util7TaskMgr13makeTaskType_INS0_11ManagedTaskEEEvPPS3_ +0x0000007100a6d9e4,WorkerThreadDelegate::invoke,48,_ZN4sead9Delegate1IN4ksys4util7TaskMgrEPPNS2_11ManagedTaskEE6invokeES6_ +0x0000007100a6da14,WorkerThreadDelegate::clone,92,_ZNK4sead9Delegate1IN4ksys4util7TaskMgrEPPNS2_11ManagedTaskEE5cloneEPNS_4HeapE +0x0000007100a6da70,WorkerThreadDelegateBase::return1,8,_ZNK4sead10IDelegate1IPPN4ksys4util11ManagedTaskEE9isNoDummyEv +0x0000007100a6da78,WorkerThreadDelegateBase::clone,8,_ZNK4sead10IDelegate1IPPN4ksys4util11ManagedTaskEE5cloneEPNS_4HeapE 0x0000007100a6da80,sub_7100A6DA80,8, 0x0000007100a6da88,nullsub_5525,4, 0x0000007100a6da8c,nullsub_5526,4, @@ -94586,17 +94586,17 @@ 0x0000007101279a54,sub_7101279A54,1448, 0x0000007101279ffc,sub_7101279FFC,12, 0x000000710127a008,sub_710127A008,8, -0x000000710127a010,BaseProcDeleter::ctor,76, -0x000000710127a05c,BaseProcDeleter::invokedPreDelete,48, -0x000000710127a08c,BaseProcDeleter::invokedUnloadActorParam,36, -0x000000710127a0b0,BaseProcDeleter::dtor,80, -0x000000710127a100,BaseProcDeleter::dtorDelete,80, -0x000000710127a150,BaseProcDeleter::init,144, -0x000000710127a1e0,sub_710127A1E0,180, -0x000000710127a294,sub_710127A294,176, -0x000000710127a344,BaseProcDeleter::x,48, -0x000000710127a374,sub_710127A374,52, -0x000000710127a3a8,sub_710127A3A8,92, +0x000000710127a010,BaseProcDeleter::ctor,76,_ZN4ksys3act15BaseProcDeleterC1Ev +0x000000710127a05c,BaseProcDeleter::invokedPreDelete,48,_ZN4ksys3act15BaseProcDeleter11doPreDeleteEPv +0x000000710127a08c,BaseProcDeleter::invokedUnloadActorParam,36,_ZN4ksys3act15BaseProcDeleter13doUnloadParamEPv +0x000000710127a0b0,BaseProcDeleter::dtor,80,_ZN4ksys3act15BaseProcDeleterD1Ev +0x000000710127a100,BaseProcDeleter::dtorDelete,80,_ZN4ksys3act15BaseProcDeleterD0Ev +0x000000710127a150,BaseProcDeleter::init,144,_ZN4ksys3act15BaseProcDeleter4initERKNS1_7InitArgE +0x000000710127a1e0,sub_710127A1E0,180,_ZN4ksys3act15BaseProcDeleter16requestPreDeleteEPNS0_8BaseProcE +0x000000710127a294,sub_710127A294,176,_ZN4ksys3act15BaseProcDeleter23requestUnloadActorParamEPNS0_10ActorParamE +0x000000710127a344,BaseProcDeleter::x,48,_ZN4ksys3act15BaseProcDeleter12unblockTasksEv +0x000000710127a374,sub_710127A374,52,_ZN4sead10Delegate1RIN4ksys3act15BaseProcDeleterEPvbE6invokeES4_ +0x000000710127a3a8,sub_710127A3A8,92,_ZNK4sead10Delegate1RIN4ksys3act15BaseProcDeleterEPvbE5cloneEPNS_4HeapE 0x000000710127a404,sub_710127A404,80, 0x000000710127a454,sub_710127A454,100, 0x000000710127a4b8,sub_710127A4B8,108, diff --git a/src/KingSystem/ActorSystem/CMakeLists.txt b/src/KingSystem/ActorSystem/CMakeLists.txt index 7d40b8c5..cd6b64e9 100644 --- a/src/KingSystem/ActorSystem/CMakeLists.txt +++ b/src/KingSystem/ActorSystem/CMakeLists.txt @@ -52,6 +52,8 @@ target_sources(uking PRIVATE actAttention.h actBaseProc.cpp actBaseProc.h + actBaseProcDeleter.cpp + actBaseProcDeleter.h actBaseProcHandle.cpp actBaseProcHandle.h actBaseProcHeapMgr.cpp diff --git a/src/KingSystem/ActorSystem/actBaseProcDeleter.cpp b/src/KingSystem/ActorSystem/actBaseProcDeleter.cpp new file mode 100644 index 00000000..a83e48d0 --- /dev/null +++ b/src/KingSystem/ActorSystem/actBaseProcDeleter.cpp @@ -0,0 +1,71 @@ +#include "KingSystem/ActorSystem/actBaseProcDeleter.h" +#include "KingSystem/ActorSystem/actActorParamMgr.h" +#include "KingSystem/ActorSystem/actBaseProc.h" +#include "KingSystem/Utils/SafeDelete.h" +#include "KingSystem/Utils/Thread/ManagedTask.h" +#include "KingSystem/Utils/Thread/TaskMgr.h" +#include "KingSystem/Utils/Thread/TaskQueue.h" + +namespace ksys::act { + +BaseProcDeleter::BaseProcDeleter() = default; + +bool BaseProcDeleter::doPreDelete(void* proc) { + BaseProc::PreDeleteArg arg; + static_cast(proc)->doPreDelete(arg); + return true; +} + +bool BaseProcDeleter::doUnloadParam(void* actor_param) { + ActorParamMgr::instance()->unloadParam(static_cast(actor_param)); + return true; +} + +BaseProcDeleter::~BaseProcDeleter() { + if (mTaskMgr) { + mTaskMgr->finalize(); + util::safeDelete(mTaskMgr); + } +} + +void BaseProcDeleter::init(const InitArg& arg) { + auto* heap = arg.heap; + mTaskQueue = arg.task_queue; + mTaskMgr = new (heap) util::TaskMgr(heap); + mTaskMgr->init(arg.task_queue_size, heap); +} + +bool BaseProcDeleter::requestPreDelete(BaseProc* proc) { + util::TaskRequest request{false}; + request.mSynchronous = false; + request.mQueue = mTaskQueue; + request.mDelegate = &mPreDeleteDelegate; + request.mUserData = proc; + request.mLaneId = u8(TaskLane::PreDelete); + request.mName = "PreDelete"; + + util::TaskMgrRequest req; + req.request = &request; + return mTaskMgr->trySubmitRequest(req); +} + +void BaseProcDeleter::requestUnloadActorParam(ActorParam* param) { + util::TaskRequest request{false}; + request.mSynchronous = false; + request.mQueue = mTaskQueue; + request.mDelegate = &mUnloadActorParamDelegate; + request.mUserData = param; + request.mLaneId = u8(TaskLane::UnloadActorParam); + request.mName = "UnloadActorParam"; + + util::TaskMgrRequest req; + req.request = &request; + mTaskMgr->submitRequest(req); +} + +void BaseProcDeleter::unblockTasks() { + mTaskQueue->unblockTasks(u8(TaskLane::PreDelete)); + mTaskQueue->unblockTasks(u8(TaskLane::UnloadActorParam)); +} + +} // namespace ksys::act diff --git a/src/KingSystem/ActorSystem/actBaseProcDeleter.h b/src/KingSystem/ActorSystem/actBaseProcDeleter.h new file mode 100644 index 00000000..9c48c07e --- /dev/null +++ b/src/KingSystem/ActorSystem/actBaseProcDeleter.h @@ -0,0 +1,52 @@ +#pragma once + +#include +#include +#include "KingSystem/Utils/Types.h" + +namespace ksys::util { +class TaskMgr; +class TaskQueue; +} // namespace ksys::util + +namespace ksys::act { + +class ActorParam; +class BaseProc; + +class BaseProcDeleter { +public: + struct InitArg { + sead::Heap* heap; + util::TaskQueue* task_queue; + int task_queue_size; + }; + + BaseProcDeleter(); + virtual ~BaseProcDeleter(); + + void init(const InitArg& arg); + bool requestPreDelete(BaseProc* proc); + void requestUnloadActorParam(ActorParam* param); + void unblockTasks(); + +private: + enum class TaskLane : u8 { + UnloadActorParam = 3, + PreDelete = 4, + }; + + bool doPreDelete(void* proc); + bool doUnloadParam(void* actor_param); + + util::TaskMgr* mTaskMgr{}; + util::TaskQueue* mTaskQueue{}; + sead::Buffer mBuffer; + sead::Delegate1R mPreDeleteDelegate{ + this, &BaseProcDeleter::doPreDelete}; + sead::Delegate1R mUnloadActorParamDelegate{ + this, &BaseProcDeleter::doUnloadParam}; +}; +KSYS_CHECK_SIZE_NX150(BaseProcDeleter, 0x68); + +} // namespace ksys::act