scheduler_srcs = [ 'src/main.c', 'src/cli_compat.c', 'src/handler.c', 'src/scheduler.c', 'src/sched_election.c', 'src/core.c', 'src/core_events.c', 'src/core_session.c', 'src/core_clock.c', 'src/driver.c', 'src/snapshot.c', 'src/snapshot_wire.c', 'src/snapshot_load.c', 'src/decision.c', 'src/recording.c', 'src/recording_events.c', 'src/recording_session.c', 'src/sim.c', 'src/sim_loop.c', 'src/sim_picker.c', 'src/sim_limit.c', 'src/sim_alloc.c', 'src/sim_verify.c', 'src/sim_record.c', 'src/repl.c', 'src/repl_fmt.c', 'src/repl_rollup.c', 'src/repl_break.c', 'src/repl_info.c', 'src/repl_params.c', 'src/schedobj.c', 'src/plugin.c', 'src/resource.c', 'src/alloc_cache.c', 'src/host_iter.c', 'src/plugins/fcfs.c', 'src/plugins/builtin_fcfs.c', 'src/plugins/seqjob_allocator.c', 'src/plugins/parjob_allocator.c', 'src/plugins/limit.c', ] incdir = include_directories('src', 'include', '../include', '../lib') # Task 12.1 (scheduler-core spec, Req 5 AC 22): the interactive REPL's # line-editing input loop (src/repl.c) needs readline()/add_history(). # Uses libedit (BSD), not GNU readline (GPL) -- xce_scheduler is a shipped # production daemon (unlike xce_test, a debug tool), so a GPL dependency # would encumber the whole linked binary. libedit's editline/readline.h # emulation header provides the same two calls under a permissive license; # src/controller/meson.build (xce_test's own REPL) uses the identical dep # for the same reason, kept consistent project-wide. libedit_dep = dependency('libedit') scheduler_deps = [ libxce_dep, librtti_dep, math_dep, tinylog_dep, thread_dep, libedit_dep, ] scheduler = executable('xce_scheduler', scheduler_srcs, include_directories: incdir, dependencies: scheduler_deps, link_args: wrap_link_args, install: true) # Task 4.1 (scheduler-core spec, Req 5.1/5.2): isolated compile target for # core.c AND its core_events.c/core_session.c/core_clock.c siblings (design # review follow-up: the isolation boundary is a core.c-family-wide property # -- Req 5 AC 1/AC 2 -- but until this fix the nm(1) undefined-symbol proof # below only ever mechanically covered core.c itself, leaving the other # three "kept isolation-clean by review" only, i.e. manually, with nothing # catching a regression), consumed by testsuite/test_core_isolation.c to # prove at build time that none of the four reference zero-I/O-boundary # symbols from the networking/API libraries (netio/xceapi/client/delay/ # idgen). core_clock.c is the one SANCTIONED exception to the separate # wall-clock text-scan check (it owns the core family's one legitimate # clock_gettime() call, Req 5 AC 3) -- that exemption is enforced in # test_core_isolation.c itself, not here; this archive only proves the # networking/API isolation boundary, which core_clock.c fully satisfies # (clock_gettime()/gmtime_r()/tlog_reg_format_func() are not # networking/API symbols). A static_library() here need not LINK against # anything for this purpose -- compiling these four files to objects is # enough; the archive's own undefined-symbol table (inspected via nm(1) in # the test) reflects exactly what this code calls, independent of which # libraries are nominally "dependencies" of this build target. sched_core_isolation_lib = static_library( 'sched_core_isolation', ['src/core.c', 'src/core_events.c', 'src/core_session.c', 'src/core_clock.c'], include_directories: incdir, dependencies: scheduler_deps, install: false) # Task 11.3 (scheduler-core spec, Req 5 AC 17): isolated compile target for # the simulation driver's own files, consumed by # testsuite/test_sim_isolation.c to prove at build time that # sim.c/sim_loop.c/sim_record.c/repl.c/repl_fmt.c/repl_break.c/repl_info.c/ # repl_params.c/sim_picker.c/sim_limit.c/sched_election.c reference zero # controller-facing symbols (client/netio/xceapi/delay/idgen). All files are compiled # together into ONE archive -- task 11.2 added sim_loop.c as a sibling # file to task 11.1's sim.c, task 11.5 added sim_record.c as a third, task # 12.1 added repl.c as a fourth, task 12.2 added repl_break.c/repl_info.c # as a fifth/sixth (task 12.2's own 800-line-cap split of repl.c's # breakpoint/state-inspection logic -- repl_internal.h's own "Why a split # at all" section has the full rationale), task 12.3 added repl_params.c # as a seventh (the same split, extended again for `snapshot`/`set`), # bug-1567's fix added sim_picker.c as an eighth (sim_loop.c's own # "zero line-budget headroom" -- same reason its siblings above exist -- # so the fix's picker-registration + post-load picker-rebuild-walk logic # lives here instead of growing sim_loop.c past its cap), the # scheduler-sim-repl-verbosity spec's task 7.2 remediation added repl_fmt.c # as a ninth (repl.c's own 800-line-cap split of its shared, dependency-free # formatting helpers -- repl_fmt.c's own header comment has the full # rationale), and the scheduler-sim-diagnostics spec's task 6 (bug-1825 # fix, remediation round 2) added sim_limit.c as a tenth (sim_loop.c-cap # sibling housing sim_bootstrap_limit_plugin(), mirroring sim_picker.c's # own bootstrap-function role exactly) -- covering only a subset of them # would repeat core.c's own siblings' (core_events.c/core_session.c/ # core_clock.c) never-mechanically-covered gap for the sim driver, which is # exactly the omission a prior round of this same task left in place by # adding sim_limit.c to scheduler_srcs above without also adding it here. # scheduler-sim-live-allocation spec's task 4.1 adds sched_election.c as an # eleventh: sim_loop.c's sched_sim_driver_run() now calls sched_job_picker()/ # sched_allocator() (sched_election.c) directly, no longer the file's own, # now-removed sim_picker_thread_fn() -- the same "cover every file the # driver's own compiled object actually calls" rationale sim_picker.c/ # sim_limit.c's own additions above already establish. Task 3.1 (which # relocated sched_job_picker()/sched_allocator() out of scheduler.c into # this new file) deliberately deferred this addition to task 4.1, since # sim_loop.c did not yet call either function until this task wired the # real spawn in. # Same "compiling to an object is enough, no real linking needed" rationale # as sched_core_isolation_lib above -- sched_election.c's own undefined # references (sched_make_allocation()/sched_commit_decision(), scheduler.c) # are themselves already core-safe (verified by task 3.1's own fixture) and # remain undefined in this archive exactly like every other cross-file call # already does; nm(1)'s FORBIDDEN_SYMBOLS check (test_sim_isolation.c) only # flags controller-facing names, none of which sched_election.c references. # Task 4.1 also adds sim_alloc.c as a twelfth (bug-1829 fix): sim_loop.c now # also calls sim_bootstrap_seqjob_allocator()/sim_bootstrap_parjob_ # allocator() (sim_alloc.c), the same "cover every file the driver's own # compiled object actually calls" rationale as sched_election.c immediately # above. sim_alloc.c #includes scheduler.h (for the throwaway xce_scheduler_t # wrapper its own file header comment explains) -- safe here for the exact # same reason sched_election.c's own scheduler.h include is safe: this file # is not part of test_sim_isolation.c's own enumerated text-scan list (that # list only ever covered sim.h/sim.c/sim_loop.c/sim_picker.c/sim_record.c/ # repl.c/repl.h/repl_break.c/repl_info.c/repl_internal.h/repl_params.c, never # extended to sim_limit.c or sched_election.c either), and its own compiled # object references zero controller-facing symbols (register_seqjob_ # allocator()/register_parjob_allocator(), plugins/seqjob_allocator.c and # plugins/parjob_allocator.c, touch only core-scoped resource/worker state). sched_sim_isolation_lib = static_library( 'sched_sim_isolation', ['src/sim.c', 'src/sim_loop.c', 'src/sim_picker.c', 'src/sim_limit.c', 'src/sim_alloc.c', 'src/sim_record.c', 'src/repl.c', 'src/repl_fmt.c', 'src/repl_break.c', 'src/repl_info.c', 'src/repl_params.c', 'src/repl_rollup.c', 'src/sched_election.c'], include_directories: incdir, dependencies: scheduler_deps, install: false) subdir('testsuite')