sead
Loading...
Searching...
No Matches
seadTaskMgr.h
Go to the documentation of this file.
1#ifndef SEAD_TASKMGR_H_
2#define SEAD_TASKMGR_H_
3
4#include <framework/seadHeapPolicies.h>
5#include <framework/seadMethodTree.h>
6#include <framework/seadTaskBase.h>
7#include <heap/seadHeapMgr.h>
8#include <thread/seadCriticalSection.h>
9
10namespace sead {
11
12class DelegateThread;
13class Framework;
14class Heap;
15class NullFaderTask;
16class Thread;
17
18class TaskMgr : public hostio::Node
19{
20public:
41#ifdef cafe
42 static_assert(sizeof(InitializeArg) == 0x18, "sead::TaskMgr::InitializeArg size mismatch");
43#endif // cafe
44
45 class TaskCreateContextMgr;
46
47public:
49
50 static TaskMgr* initialize(const InitializeArg& arg);
51 void finalize();
52
54 {
55 return mParentFramework;
56 }
57
59 {
60 return mHeapArray.getPrimaryHeap();
61 }
62
64 {
65 return mRootTask;
66 }
67
68private:
69 void doInit_();
71 void createHeap_(HeapArray* ha, const TaskBase::CreateArg& arg);
72
73public:
75
76 template <typename T>
78 {
79 TaskBase* task = createTaskSync(arg);
80 T* derived = DynamicCast<T>(task);
81 SEAD_ASSERT(derived != nullptr);
82 return derived;
83 }
84
85private:
87
88public:
90
91private:
92 bool doRequestCreateTask_(const TaskBase::CreateArg& arg, DelegateEvent<TaskBase*>::Slot* system_slot);
94 bool changeTaskState_(TaskBase* task, TaskBase::State state);
95
96public:
97 bool requestTakeover(const TaskBase::TakeoverArg& arg);
98 bool requestTransition(TaskBase* from, TaskBase* to, FaderTaskBase* fader);
99 bool requestPush(const TaskBase::PushArg& arg);
100 TaskBase* pushSync(const TaskBase::PushArg& arg);
101 bool requestPop(TaskBase* pop_task, FaderTaskBase* fader);
102 bool popSync(TaskBase* pop_task);
103 bool requestPop(TaskBase* pop_task, TaskBase* to_task, FaderTaskBase* fader);
104
105private:
106 void prepare_(Thread*, /* MessageQueue::Element */ s32 msg);
107
108public:
109 void destroyTaskSync(TaskBase* task);
110 void requestDestroyTask(TaskBase* task, FaderTaskBase* fader);
111
112private:
114 void doDestroyTask_(TaskBase* task);
117
118public:
120 TaskBase* findTask(const TaskClassID& classID);
122 void afterCalc();
123
124private:
128 NullFaderTask* mNullFaderTask;
136 TaskCreateContextMgr* mTaskCreateContextMgr;
144};
145#ifdef cafe
146static_assert(sizeof(TaskMgr) == 0x1A8, "sead::TaskMgr size mismatch");
147#endif // cafe
148
149} // namespace sead
150
151#define SEAD_TASK_SINGLETON_DISPOSER(CLASS)
152 public:
153 static CLASS* instance() { return sInstance; }
154 static void setInstance_(sead::TaskBase* instance);
155 static void deleteInstance();
156
157 protected:
158 class SingletonDisposer_
159 {
160 public:
161 SingletonDisposer_() : mIsSetAsSingleton_(false) { }
162 ~SingletonDisposer_();
163
164 bool mIsSetAsSingleton_;
165 };
166
167 private:
168 CLASS(const CLASS&);
169 const CLASS& operator=(const CLASS&);
170
171 protected:
172 SingletonDisposer_ mSingletonDisposer_;
173
174 static CLASS* sInstance;
175
176 friend class SingletonDisposer_;
177
178#define SEAD_TASK_SET_SINGLETON_INSTANCE(CLASS)
179 void CLASS::setInstance_(sead::TaskBase* instance)
180 {
181 if (CLASS::sInstance == nullptr)
182 {
183 CLASS::sInstance = static_cast<CLASS*>(instance);
184 static_cast<CLASS*>(instance)->mSingletonDisposer_.mIsSetAsSingleton_ = true;
185 }
186 else
187 {
188 /*SEAD_ASSERT_MSG(false, "Create Singleton Twice (%s) : addr %x", "CLASS", CLASS::sInstance);*/
189 }
190 }
191
192#define SEAD_TASK_DELETE_SINGLETON_INSTANCE(CLASS)
193 void CLASS::deleteInstance()
194 {
195 if (CLASS::sInstance != nullptr)
196 {
197 CLASS::sInstance->mTaskMgr->destroyTaskSync(CLASS::sInstance);
198 CLASS::sInstance = nullptr;
199 }
200 }
201
202#define SEAD_TASK_SINGLETON_DISPOSER_IMPL(CLASS)
203 CLASS* CLASS::sInstance = nullptr;
204
207
208 CLASS::SingletonDisposer_::~SingletonDisposer_()
209 {
210 if (mIsSetAsSingleton_)
211 {
212 CLASS::sInstance = nullptr;
213 }
214 }
215
216#endif // SEAD_TASKMGR_H_
Definition seadCriticalSection.h:13
Definition seadDelegateThread.h:12
Definition seadFramework.h:24
Definition seadHeapPolicies.h:10
Definition seadHeap.h:23
Definition seadMethodTree.h:17
Definition seadTaskBase.h:26
State
Definition seadTaskBase.h:35
TList< TaskBase * > List
Definition seadTaskBase.h:31
Definition seadTaskID.h:40
Definition seadTaskMgr.h:19
TaskBase * getRootTask() const
Definition seadTaskMgr.h:63
TaskBase * pushSync(const TaskBase::PushArg &arg)
TaskBase::List mDestroyableList
Definition seadTaskMgr.h:134
TaskBase * mRootTask
Definition seadTaskMgr.h:138
bool requestPop(TaskBase *pop_task, FaderTaskBase *fader)
T * createSingletonTaskSync(const TaskBase::CreateArg &arg)
Definition seadTaskMgr.h:77
TaskBase::List mStaticList
Definition seadTaskMgr.h:132
NullFaderTask * mNullFaderTask
Definition seadTaskMgr.h:128
void prepare_(Thread *, s32 msg)
MethodTreeNode mCalcDestructionTreeNode
Definition seadTaskMgr.h:141
TaskBase::CreateArg mRootTaskCreateArg
Definition seadTaskMgr.h:139
void beginCreateRootTask_()
bool popSync(TaskBase *pop_task)
void destroyTaskSync(TaskBase *task)
Definition seadTaskMgr.cpp:107
TaskBase * createTaskSync(const TaskBase::CreateArg &arg)
void createHeap_(HeapArray *ha, const TaskBase::CreateArg &arg)
void calcDestruction_()
void doDestroyTask_(TaskBase *task)
Definition seadTaskMgr.cpp:119
bool requestCreateTask(const TaskBase::CreateArg &arg)
Framework * getFramework() const
Definition seadTaskMgr.h:53
TaskBase::List mActiveList
Definition seadTaskMgr.h:131
TaskMgr(const InitializeArg &arg)
bool requestTakeover(const TaskBase::TakeoverArg &arg)
void appendToList_(TaskBase::List &ls, TaskBase *task)
static TaskMgr * initialize(const InitializeArg &arg)
void afterCalc()
DelegateThread * mPrepareThread
Definition seadTaskMgr.h:127
bool doRequestCreateTask_(const TaskBase::CreateArg &arg, DelegateEvent< TaskBase * >::Slot *system_slot)
HeapArray mHeapArray
Definition seadTaskMgr.h:135
TaskBase * findTask(const TaskClassID &classID)
bool requestTransition(TaskBase *from, TaskBase *to, FaderTaskBase *fader)
bool requestPush(const TaskBase::PushArg &arg)
bool requestPop(TaskBase *pop_task, TaskBase *to_task, FaderTaskBase *fader)
TaskCreateContextMgr * mTaskCreateContextMgr
Definition seadTaskMgr.h:136
bool destroyable_(TaskBase *task)
void finalize()
Definition seadTaskMgr.cpp:141
void requestDestroyTask(TaskBase *task, FaderTaskBase *fader)
Heap * getHeap()
Definition seadTaskMgr.h:58
CriticalSection mCriticalSection
Definition seadTaskMgr.h:125
TaskMgr::InitializeArg mInitializeArg
Definition seadTaskMgr.h:140
u32 _1a4
Definition seadTaskMgr.h:143
u32 mMaxCreateQueueSize
Definition seadTaskMgr.h:137
void calcCreation_()
TaskBase * doCreateTask_(const TaskBase::CreateArg &arg, HeapArray *ha)
void beforeCalc()
void destroyAllAndCreateRoot()
TaskBase::List mPrepareList
Definition seadTaskMgr.h:129
u32 _1a0
Definition seadTaskMgr.h:142
Framework * mParentFramework
Definition seadTaskMgr.h:126
TaskBase::List mDyingList
Definition seadTaskMgr.h:133
TaskBase::List mPrepareDoneList
Definition seadTaskMgr.h:130
bool changeTaskState_(TaskBase *task, TaskBase::State state)
Definition seadTaskMgr.cpp:13
Definition seadThread.h:28
Definition seadHostIODummy.h:25
Definition seadHeap.h:14
Definition seadAssert.h:44
#define SEAD_ASSERT(condition)
Definition seadAssert.h:24
#define SEAD_TASK_DELETE_SINGLETON_INSTANCE(CLASS)
Definition seadTaskMgr.h:192
#define SEAD_TASK_SET_SINGLETON_INSTANCE(CLASS)
Definition seadTaskMgr.h:178
Definition seadTaskBase.h:53
Definition seadTaskMgr.h:22
Framework * parent_framework
Definition seadTaskMgr.h:39
InitializeArg(const TaskBase::CreateArg &roottask_arg)
Definition seadTaskMgr.h:24
Heap * heap
Definition seadTaskMgr.h:38
u32 prepare_stack_size
Definition seadTaskMgr.h:35
const TaskBase::CreateArg & roottask_create_arg
Definition seadTaskMgr.h:37
u32 create_queue_size
Definition seadTaskMgr.h:34
s32 prepare_priority
Definition seadTaskMgr.h:36