summaryrefslogtreecommitdiff
path: root/src/KingSystem/Utils/Thread
diff options
context:
space:
mode:
authorLéo Lam <leo@leolam.fr>2020-09-27 14:15:42 +0200
committerLéo Lam <leo@leolam.fr>2020-09-27 14:16:10 +0200
commit50ebf5116f9eda896479e88cc4968fd56775719c (patch)
tree9a37b6f2367cf3afbff3db101b203e84c40293c5 /src/KingSystem/Utils/Thread
parentdc7d55e71e0d24f19edce09ec77e62acae2a1c70 (diff)
ksys/util: Add TaskMgr initialisation helper
Diffstat (limited to 'src/KingSystem/Utils/Thread')
-rw-r--r--src/KingSystem/Utils/Thread/TaskMgr.h29
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;