1#ifndef __H__SYSTEMS_SCHEDULER__
2#define __H__SYSTEMS_SCHEDULER__
60#define scheduler_declare_system_with_custom_runner( \
61 scheduler, mut, cons, system_name, runner_f, deps_on, dependency_count, \
63 name_t runner_f##_name = as_name(#system_name); \
65 system_req_t __system_req = __VA_ARGS__; \
66 __system_req.name = runner_f##_name; \
67 __system_req.depends_on = deps_on; \
68 __system_req.depends_on_count = dependency_count; \
69 system_req_entity_kinds_const(&__system_req, cons); \
70 system_req_entity_kinds_mut(&__system_req, mut); \
71 scheduler_add_system(scheduler, __system_req, runner_f); \
79#define scheduler_declare_system(scheduler, mut, cons, system_name, \
80 depends_on, dependency_count, ...) \
81 scheduler_declare_system_with_custom_runner( \
82 scheduler, mut, cons, system_name, system_##system_name, depends_on, \
83 dependency_count, __VA_ARGS__)
87 void *system_specific_data) {
109 (system_specific_data == 0));
130 fprintf(out,
"digraph G {\n\trankdir=\"TB\";\n");
135 if (sys_list->
size == 0)
141 "\tsubgraph cluster_%d {\n\t\tlabel = \"%s\";\n\t\tstyle = "
142 "filled;\n\t\tcolor = lightgrey;\n",
143 phase_idx, sys_name_str);
145 for (
sz i = 0; i < sys_list->
size; i++) {
152 fprintf(out,
"\t\t%ld [label=\"%s #%ld\"];\n", name, name_str, i);
156 fprintf(out,
"\t\t%ld -> %ld;\n", dependency, name);
162 fprintf(out,
"\t}\n");
165 fprintf(out,
"\tstart [color = blue, shape = Mdiamond];\n");
166 fprintf(out,
"\tend [color = blue, shape = Mdiamond];\n");
167 fprintf(out,
"\t{ rank=\"source\"; \"start\";}\n");
168 fprintf(out,
"\t{ rank=\"sink\"; \"end\";}\n");
170 fprintf(out,
"\tstart -> %ld [color = blue];\n",
172 for (
sz i = 0; i < execution_order.
size - 1; i++) {
176 fprintf(out,
"\t%ld -> %ld [color = blue];\n", n1, n2);
179 fprintf(out,
"\t%ld -> end [color = blue];\n",
186 list_t *scheduler_system_list) {
189 map_t coordinate_compression_forward;
190 map_init_ty(
sz, &coordinate_compression_forward, alloc);
191 map_t coordinate_compression_reverse;
192 map_init_ty(
sz, &coordinate_compression_reverse, alloc);
194 for (
sz i = 0; i < scheduler_system_list->
size; i++) {
196 if (!map_get(&coordinate_compression_forward, n)) {
198 &coordinate_compression_forward.
size);
202 ASSERT__(coordinate_compression_forward.
size == scheduler_system_list->
size);
203 ASSERT__(coordinate_compression_reverse.
size == scheduler_system_list->
size);
205 map_cleanup(&coordinate_compression_forward);
206 map_cleanup(&coordinate_compression_reverse);
224 for (
sz i = 0; i < sys_list->
size; i++) {
#define ASSERT__(expr)
Definition defs.h:21
size_t sz
Definition defs.h:51
#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 name_t as_name(const char *str)
Definition names.h:33
static const char * name_as_str(name_t name)
Definition names.h:51
u64 name_t
Definition names.h:14
static system_payload_t system_payload_new_inherit(system_req_t requirements, system_payload_t *parent)
Copy the parameters specified in the requirements into a new payload.
Definition require.h:127
void(* system_runner_f)(system_payload_t payload, allocator_t temporary_allocator)
Definition require.h:64
static const char * system_phase_to_str(system_phase_t phase)
Definition require.h:21
@ SYSTEM_RESOURCE_MASK_SYSTEM_SPECIFIC_DATA
Definition require.h:71
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:121
static void scheduler_add_system(scheduler_t *scheduler, system_req_t req, system_runner_f runner)
Definition scheduler.h:51
static void scheduler_set_parent_payload(scheduler_t *scheduler, system_payload_t payload)
Definition scheduler.h:209
static void scheduler_add_system_declared(scheduler_t *scheduler, system_requirements_declaration_t *declaration)
Definition scheduler.h:116
scheduler_strategy_t
Definition scheduler.h:10
@ SCHEDULER_STRATEGY_RANDOM
Definition scheduler.h:11
static void scheduler_tick(scheduler_t *scheduler, double delta_time)
Definition scheduler.h:216
static void scheduler_end_running(scheduler_t *scheduler)
Definition scheduler.h:235
static scheduler_t scheduler_new(scheduler_strategy_t strategy, allocator_t persistent_allocator, allocator_t temporary_allocator)
Definition scheduler.h:30
static void scheduler_begin_running(scheduler_t *scheduler)
Definition scheduler.h:220
static void scheduler__topological_sort(allocator_t alloc, list_t *scheduler_system_list)
Definition scheduler.h:185
static void scheduler_add_system_declared_specific_data(scheduler_t *scheduler, system_requirements_declaration_t *declaration, void *system_specific_data)
Definition scheduler.h:85
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:14
system_runner_f runner
Definition scheduler.h:16
system_req_t reqs
Definition scheduler.h:15
Definition scheduler.h:19
list_t * scheduler_systems
Definition scheduler.h:27
allocator_t temporary_allocator
Allocator for all data that lives for one frame.
Definition scheduler.h:23
system_payload_t parent_payload
Definition scheduler.h:26
scheduler_strategy_t strategy
Definition scheduler.h:24
allocator_t persistent_allocator
Allocator for the data that persist over the scheduler's lifetime.
Definition scheduler.h:21
double delta_time
Definition require.h:60
system_resource_mask_t resources
Definition require.h:83
name_t name
Definition require.h:76
entity_kind_mask_t _entity_kinds_const
Definition require.h:78
system_phase_t phase
Definition require.h:75
u32 depends_on_count
Definition require.h:81
entity_kind_mask_t _entity_kinds_mut
Definition require.h:77
name_t * depends_on
Definition require.h:80
bool pin_to_main
Definition require.h:86
system_resource_mask_t resources
Definition require.h:99
entity_kind_mask_t entities_mut
Definition require.h:94
system_phase_t phase
Definition require.h:91
const char ** dependencies
Definition require.h:96
entity_kind_mask_t entities_const
Definition require.h:93
const char * name
Definition require.h:90
system_runner_f runner
Definition require.h:102
u32 dependency_count
Definition require.h:97
bool pin_to_main
Definition require.h:100