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
79private:
81
82public:
84
85private:
86 bool doRequestCreateTask_(const TaskBase::CreateArg& arg, DelegateEvent<TaskBase*>::Slot* system_slot);
88 bool changeTaskState_(TaskBase* task, TaskBase::State state);
89
90public:
91 bool requestTakeover(const TaskBase::TakeoverArg& arg);
92 bool requestTransition(TaskBase* from, TaskBase* to, FaderTaskBase* fader);
93 bool requestPush(const TaskBase::PushArg& arg);
94 TaskBase* pushSync(const TaskBase::PushArg& arg);
95 bool requestPop(TaskBase* pop_task, FaderTaskBase* fader);
96 bool popSync(TaskBase* pop_task);
97 bool requestPop(TaskBase* pop_task, TaskBase* to_task, FaderTaskBase* fader);
98
99private:
100 void prepare_(Thread*, /* MessageQueue::Element */ s32 msg);
101
102public:
103 void destroyTaskSync(TaskBase* task);
104 void requestDestroyTask(TaskBase* task, FaderTaskBase* fader);
105
106private:
108 void doDestroyTask_(TaskBase* task);
111
112public:
114 TaskBase* findTask(const TaskClassID& classID);
116 void afterCalc();
117
118private:
122 NullFaderTask* mNullFaderTask;
130 TaskCreateContextMgr* mTaskCreateContextMgr;
138};
139#ifdef cafe
140static_assert(sizeof(TaskMgr) == 0x1A8, "sead::TaskMgr size mismatch");
141#endif // cafe
142
143} // namespace sead
144
145#define SEAD_TASK_SINGLETON_DISPOSER(CLASS)
146 public:
147 static CLASS* instance() { return sInstance; }
148 static void setInstance_(sead::TaskBase* instance);
149 static void deleteInstance();
150
151 protected:
152 class SingletonDisposer_
153 {
154 public:
155 SingletonDisposer_() : mIsSetAsSingleton_(false) { }
156 ~SingletonDisposer_();
157
158 bool mIsSetAsSingleton_;
159 };
160
161 private:
162 CLASS(const CLASS&);
163 const CLASS& operator=(const CLASS&);
164
165 protected:
166 SingletonDisposer_ mSingletonDisposer_;
167
168 static CLASS* sInstance;
169
170 friend class SingletonDisposer_;
171
172#define SEAD_TASK_SET_SINGLETON_INSTANCE(CLASS)
173 void CLASS::setInstance_(sead::TaskBase* instance)
174 {
175 if (CLASS::sInstance == nullptr)
176 {
177 CLASS::sInstance = static_cast<CLASS*>(instance);
178 static_cast<CLASS*>(instance)->mSingletonDisposer_.mIsSetAsSingleton_ = true;
179 }
180 else
181 {
182 /*SEAD_ASSERT_MSG(false, "Create Singleton Twice (%s) : addr %x", "CLASS", CLASS::sInstance);*/
183 }
184 }
185
186#define SEAD_TASK_DELETE_SINGLETON_INSTANCE(CLASS)
187 void CLASS::deleteInstance()
188 {
189 if (CLASS::sInstance != nullptr)
190 {
191 CLASS::sInstance->mTaskMgr->destroyTaskSync(CLASS::sInstance);
192 CLASS::sInstance = nullptr;
193 }
194 }
195
196#define SEAD_TASK_SINGLETON_DISPOSER_IMPL(CLASS)
197 CLASS* CLASS::sInstance = nullptr;
198
201
202 CLASS::SingletonDisposer_::~SingletonDisposer_()
203 {
204 if (mIsSetAsSingleton_)
205 {
206 CLASS::sInstance = nullptr;
207 }
208 }
209
210#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:128
TaskBase * mRootTask
Definition seadTaskMgr.h:132
bool requestPop(TaskBase *pop_task, FaderTaskBase *fader)
T * createSingletonTaskSync(const TaskBase::CreateArg &arg)
TaskBase::List mStaticList
Definition seadTaskMgr.h:126
NullFaderTask * mNullFaderTask
Definition seadTaskMgr.h:122
void prepare_(Thread *, s32 msg)
MethodTreeNode mCalcDestructionTreeNode
Definition seadTaskMgr.h:135
TaskBase::CreateArg mRootTaskCreateArg
Definition seadTaskMgr.h:133
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:125
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:121
bool doRequestCreateTask_(const TaskBase::CreateArg &arg, DelegateEvent< TaskBase * >::Slot *system_slot)
HeapArray mHeapArray
Definition seadTaskMgr.h:129
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:130
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:119
TaskMgr::InitializeArg mInitializeArg
Definition seadTaskMgr.h:134
u32 _1a4
Definition seadTaskMgr.h:137
u32 mMaxCreateQueueSize
Definition seadTaskMgr.h:131
void calcCreation_()
TaskBase * doCreateTask_(const TaskBase::CreateArg &arg, HeapArray *ha)
void beforeCalc()
void destroyAllAndCreateRoot()
TaskBase::List mPrepareList
Definition seadTaskMgr.h:123
u32 _1a0
Definition seadTaskMgr.h:136
Framework * mParentFramework
Definition seadTaskMgr.h:120
TaskBase::List mDyingList
Definition seadTaskMgr.h:127
TaskBase::List mPrepareDoneList
Definition seadTaskMgr.h:124
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_TASK_DELETE_SINGLETON_INSTANCE(CLASS)
Definition seadTaskMgr.h:186
#define SEAD_TASK_SET_SINGLETON_INSTANCE(CLASS)
Definition seadTaskMgr.h:172
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