22 #ifndef ALCACHOFA_SCHEDULER_H 23 #define ALCACHOFA_SCHEDULER_H 25 #include "alcachofa/common.h" 27 #include "common/stack.h" 28 #include "common/str.h" 29 #include "common/type_traits.h" 54 enum class TaskReturnType {
61 static inline TaskReturn yield() {
return {}; }
65 inline TaskReturnType type()
const {
return _type; }
66 inline int32 returnValue()
const {
67 assert(_type == TaskReturnType::Finished);
70 inline Task *taskToWaitFor()
const {
71 assert(_type == TaskReturnType::Waiting);
72 return _taskToWaitFor;
88 virtual void debugPrint() = 0;
90 virtual const char *taskName()
const = 0;
92 inline Process &process()
const {
return _process; }
95 Task *delay(uint32 millis);
98 template<
class TObject>
99 void syncObjectAsString(
Common::Serializer &s, TObject *&
object,
bool optional =
false)
const {
102 ObjectBase *base =
const_cast<Common::remove_const_t<TObject> *
>(object);
103 syncObjectAsString(s, base, optional);
104 object =
dynamic_cast<TObject *
>(base);
105 if (
object ==
nullptr && base !=
nullptr)
106 errorForUnexpectedObjectType(base);
111 void errorForUnexpectedObjectType(
const ObjectBase *base)
const;
122 void debugPrint()
override;
124 const char *taskName()
const override;
130 #define DECLARE_TASK(TaskName) \ 131 extern Task *constructTask_##TaskName(Process &process, Serializer &s) { \ 132 return new TaskName(process, s); \ 134 const char *TaskName::taskName() const { \ 144 default: assert(false && "Invalid line in task"); \ 145 } return TaskReturn::finish(0) 147 #define TASK_INTERNAL_BREAK(stage, ret) \ 154 #define TASK_YIELD(stage) TASK_INTERNAL_BREAK((stage), TaskReturn::yield()) 155 #define TASK_WAIT(stage, task) TASK_INTERNAL_BREAK((stage), TaskReturn::waitFor(task)) 157 #define TASK_RETURN(value) \ 160 return TaskReturn::finish(value); \ 163 using ProcessId = uint32;
166 Process(ProcessId pid, MainCharacterKind characterKind);
170 inline ProcessId pid()
const {
return _pid; }
171 inline MainCharacterKind &character() {
return _character; }
172 inline MainCharacterKind character()
const {
return _character; }
173 inline int32 returnValue()
const {
return _lastReturnValue; }
175 bool isActiveForPlayer()
const;
177 TaskReturnType run();
184 MainCharacterKind _character;
187 int32 _lastReturnValue = 0;
195 void backupContext();
196 void restoreContext();
197 void killAllProcesses();
198 void killAllProcessesFor(MainCharacterKind characterKind);
205 template<
typename TTask,
typename... TaskArgs>
206 Process *createProcess(MainCharacterKind character, TaskArgs&&... args) {
207 Process *process = createProcessInternal(character);
208 process->_tasks.push(
new TTask(*process, Common::forward<TaskArgs>(args)...));
213 Process *createProcessInternal(MainCharacterKind character);
219 uint8 _currentArrayI = 0;
220 ProcessId _nextPid = 1;
221 uint _currentProcessI = UINT_MAX;
227 #endif // ALCACHOFA_SCHEDULER_H Definition: alcachofa.h:45
Definition: scheduler.h:84
Definition: scheduler.h:164
Definition: serializer.h:79
Definition: scheduler.h:190
Definition: scheduler.h:60
Definition: scheduler.h:118