diff --git a/lib/sead b/lib/sead index eab3d9e0..8ca05884 160000 --- a/lib/sead +++ b/lib/sead @@ -1 +1 @@ -Subproject commit eab3d9e09fcf11b1ef052bc1cd1b339fb4fe387b +Subproject commit 8ca05884c751b7211d051ec8c0700ae202a54860 diff --git a/src/KingSystem/Utils/Thread/TaskMgr.h b/src/KingSystem/Utils/Thread/TaskMgr.h index 76a91ad9..f3b7e050 100644 --- a/src/KingSystem/Utils/Thread/TaskMgr.h +++ b/src/KingSystem/Utils/Thread/TaskMgr.h @@ -1,5 +1,6 @@ #pragma once +#include #include #include #include @@ -9,12 +10,13 @@ #include #include #include +#include "KingSystem/Utils/HeapUtil.h" #include "KingSystem/Utils/Thread/Event.h" +#include "KingSystem/Utils/Thread/ManagedTask.h" #include "KingSystem/Utils/Types.h" namespace ksys::util { -class ManagedTask; class ManagedTaskHandle; class TaskRequest; struct TaskMgrRequest; @@ -38,6 +40,12 @@ public: virtual ~TaskMgr(); void init(s32 num_tasks, sead::Heap* heap, ManagedTaskFactory& factory); + + template + void init(s32 num_tasks, sead::Heap* heap) { + initImpl_(num_tasks, heap); + } + void finalize(); void submitRequest(TaskMgrRequest& request); @@ -73,6 +81,25 @@ protected: return ret; } + template + void makeTaskType_(ManagedTask** task) { + *task = new TaskType(getCurrentHeap()); + } + + template + void initImpl_(s32 num_tasks, sead::Heap* heap) { + sead::Delegate1 factory{this, &TaskMgr::makeTaskType_}; + init(num_tasks, heap, factory); + + if (hasTasks()) { + Task* task = nullptr; + if (mFreeTaskLists[0].size() >= 1) + task = mFreeTaskLists[0].front(); + const bool is_derived_from_managed_task = sead::IsDerivedFrom(task); + SEAD_ASSERT(is_derived_from_managed_task); + } + } + sead::TypedBitFlag mFlags; u8 mListIndex = 0; ManagedTask* mTask = nullptr;