diff options
| author | Léo Lam <leo@leolam.fr> | 2020-09-27 14:15:42 +0200 |
|---|---|---|
| committer | Léo Lam <leo@leolam.fr> | 2020-09-27 14:16:10 +0200 |
| commit | 50ebf5116f9eda896479e88cc4968fd56775719c (patch) | |
| tree | 9a37b6f2367cf3afbff3db101b203e84c40293c5 /src/KingSystem/Utils/Thread | |
| parent | dc7d55e71e0d24f19edce09ec77e62acae2a1c70 (diff) | |
ksys/util: Add TaskMgr initialisation helper
Diffstat (limited to 'src/KingSystem/Utils/Thread')
| -rw-r--r-- | src/KingSystem/Utils/Thread/TaskMgr.h | 29 |
1 files changed, 28 insertions, 1 deletions
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 <basis/seadRawPrint.h> #include <container/seadBuffer.h> #include <container/seadOffsetList.h> #include <container/seadSafeArray.h> @@ -9,12 +10,13 @@ #include <prim/seadScopedLock.h> #include <prim/seadTypedBitFlag.h> #include <thread/seadCriticalSection.h> +#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 <typename TaskType> + void init(s32 num_tasks, sead::Heap* heap) { + initImpl_<TaskType>(num_tasks, heap); + } + void finalize(); void submitRequest(TaskMgrRequest& request); @@ -73,6 +81,25 @@ protected: return ret; } + template <typename TaskType> + void makeTaskType_(ManagedTask** task) { + *task = new TaskType(getCurrentHeap()); + } + + template <typename TaskType> + void initImpl_(s32 num_tasks, sead::Heap* heap) { + sead::Delegate1<TaskMgr, ManagedTask**> factory{this, &TaskMgr::makeTaskType_<TaskType>}; + 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<ManagedTask>(task); + SEAD_ASSERT(is_derived_from_managed_task); + } + } + sead::TypedBitFlag<Flag, u8> mFlags; u8 mListIndex = 0; ManagedTask* mTask = nullptr; |
