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"
54enum 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); \
163using 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; }
177 TaskReturnType run();
180 void lockInteraction();
181 void unlockInteraction();
186 MainCharacterKind _character;
189 int32 _lastReturnValue = 0;
198 void backupContext();
199 void restoreContext();
200 void killAllProcesses();
201 void killAllProcessesFor(MainCharacterKind characterKind);
208 template<
typename TTask,
typename... TaskArgs>
209 Process *createProcess(MainCharacterKind character, TaskArgs&&... args) {
210 Process *process = createProcessInternal(character);
211 process->_tasks.push(
new TTask(*process, Common::forward<TaskArgs>(args)...));
216 Process *createProcessInternal(MainCharacterKind character);
222 uint8 _currentArrayI = 0;
223 ProcessId _nextPid = 1;
224 uint _currentProcessI = UINT_MAX;
Definition: scheduler.h:164
bool isActiveForPlayer() const
and thus should e.g. draw subtitles or effects
Definition: scheduler.h:193
Definition: serializer.h:80
Definition: scheduler.h:118
Definition: scheduler.h:84
Definition: scheduler.h:60