1#ifndef __H__SYSTEMS_SCHEDULER__
2#define __H__SYSTEMS_SCHEDULER__
71#define scheduler_declare_system_with_custom_runner( \
72 scheduler, mut, cons, system_name, runner_f, deps_on, dependency_count, \
74 name_t runner_f##_name = as_name(#system_name); \
76 system_req_t __system_req = __VA_ARGS__; \
77 __system_req.name = runner_f##_name; \
78 __system_req.depends_on = deps_on; \
79 __system_req.depends_on_count = dependency_count; \
80 system_req_entity_kinds_const(&__system_req, cons); \
81 system_req_entity_kinds_mut(&__system_req, mut); \
82 scheduler_add_system(scheduler, __system_req, runner_f); \
90#define scheduler_declare_system(scheduler, mut, cons, system_name, \
91 depends_on, dependency_count, ...) \
92 scheduler_declare_system_with_custom_runner( \
93 scheduler, mut, cons, system_name, system_##system_name, depends_on, \
94 dependency_count, __VA_ARGS__)
105 fprintf(out,
"digraph G {\n\trankdir=\"TB\";\n");
110 if (sys_list->
size == 0)
116 "\tsubgraph cluster_%d {\n\t\tlabel = \"%s\";\n\t\tstyle = "
117 "filled;\n\t\tcolor = lightgrey;\n",
118 phase_idx, sys_name_str);
120 for (
sz i = 0; i < sys_list->
size; i++) {
127 fprintf(out,
"\t\t%ld [label=\"%s #%ld\"];\n", name, name_str, i);
131 fprintf(out,
"\t\t%ld -> %ld;\n", dependency, name);
137 fprintf(out,
"\t}\n");
140 fprintf(out,
"\tstart [color = blue, shape = Mdiamond];\n");
141 fprintf(out,
"\tend [color = blue, shape = Mdiamond];\n");
142 fprintf(out,
"\t{ rank=\"source\"; \"start\";}\n");
143 fprintf(out,
"\t{ rank=\"sink\"; \"end\";}\n");
145 fprintf(out,
"\tstart -> %ld [color = blue];\n",
147 for (
sz i = 0; i < execution_order.
size - 1; i++) {
151 fprintf(out,
"\t%ld -> %ld [color = blue];\n", n1, n2);
154 fprintf(out,
"\t%ld -> end [color = blue];\n",
161 list_t *scheduler_system_list) {
164 map_t coordinate_compression_forward;
165 map_init_ty(
sz, &coordinate_compression_forward, alloc);
166 map_t coordinate_compression_reverse;
167 map_init_ty(
sz, &coordinate_compression_reverse, alloc);
169 for (
sz i = 0; i < scheduler_system_list->
size; i++) {
171 if (!map_get(&coordinate_compression_forward, n)) {
173 &coordinate_compression_forward.
size);
177 ASSERT__(coordinate_compression_forward.
size == scheduler_system_list->
size);
178 ASSERT__(coordinate_compression_reverse.
size == scheduler_system_list->
size);
180 map_cleanup(&coordinate_compression_forward);
181 map_cleanup(&coordinate_compression_reverse);
186 "Attempt to change plans while the scheduler is running");
206 "The requirement list must be set before running");
208 "The scheduler must have planned the system order");
210 "The scheduler must be ticked every time before running");
216 for (
sz i = 0; i < sys_list->
size; i++) {
228 for (
sz i = 0; i < sys_list->
size; i++) {
#define ASSERT__(expr)
Definition defs.h:21
size_t sz
Definition defs.h:51
#define ASSERT_(expr, msg)
Definition defs.h:29
#define list_get_ty_ptr(ty, ls, idx)
Definition list.h:128
#define list_init_ty(ty, ls, alloc)
Definition list.h:36
#define list_get_ty(ty, ls, idx)
Definition list.h:130
#define list_init_ty_with_capacity(ty, ls, alloc, capacity)
Definition list.h:38
#define list_push_var(ls, var)
Definition list.h:83
#define map_insert_ty(ty, map, key, data)
Definition map.h:196
static allocator_t allocator_new_stack_alloc()
Definition memory.h:113
static const char * name_as_str(name_t name)
Definition names.h:51
u64 name_t
Definition names.h:14
static void system_req_fill_in(system_req_t *target, const system_req_t parent)
Definition require.h:87
static const char * system_phase_to_str(system_phase_t phase)
Definition require.h:21
system_phase_t
Definition require.h:10
@ SYSTEM_PHASE_count
Definition require.h:18
static void scheduler_dump_dependency_graph(scheduler_t *scheduler, FILE *out)
Definition scheduler.h:96
static void scheduler_add_system(scheduler_t *scheduler, system_req_t req, system_runner_f runner)
Definition scheduler.h:60
void(* system_runner_f)(system_req_t payload, allocator_t temporary_allocator)
Definition scheduler.h:10
scheduler_strategy_t
Definition scheduler.h:13
@ SCHEDULER_STRATEGY_RANDOM
Definition scheduler.h:14
static void scheduler_tick(scheduler_t *scheduler, double delta_time)
Definition scheduler.h:199
static void scheduler_end_running(scheduler_t *scheduler)
Definition scheduler.h:236
static void scheduler_set_requirements(scheduler_t *scheduler, system_req_t reqs)
Definition scheduler.h:191
static scheduler_t scheduler_new(scheduler_strategy_t strategy, allocator_t persistent_allocator, allocator_t temporary_allocator)
Definition scheduler.h:36
static void scheduler_plan(scheduler_t *scheduler)
Definition scheduler.h:184
static void scheduler_begin_running(scheduler_t *scheduler)
Definition scheduler.h:204
static void scheduler__topological_sort(allocator_t alloc, list_t *scheduler_system_list)
Definition scheduler.h:160
A generic allocator type passed by value. Contains a fallback allocator and a set of function pointer...
Definition memory.h:30
sz size
Definition list.h:17
sz _entry
Definition list.h:15
sz size
The amount of elements currently in the map.
Definition map.h:38
Definition scheduler.h:17
system_runner_f runner
Definition scheduler.h:19
system_req_t reqs
Definition scheduler.h:18
Definition scheduler.h:22
list_t * scheduler_systems
Definition scheduler.h:33
system_req_t requirements
Definition scheduler.h:32
allocator_t temporary_allocator
Definition scheduler.h:24
bool is_requirement_list_set
Definition scheduler.h:27
bool is_schedule_planned
Definition scheduler.h:28
bool is_running
Definition scheduler.h:30
scheduler_strategy_t strategy
Definition scheduler.h:25
allocator_t persistent_allocator
Definition scheduler.h:23
bool is_ticked
Definition scheduler.h:29
name_t name
Definition require.h:53
system_phase_t phase
Definition require.h:52
u32 depends_on_count
Definition require.h:58
double delta_time
Definition require.h:65
name_t * depends_on
Definition require.h:57