feat(scheduler-core): implement session-start signal + decision callback (task 4.4)
Adds xce_core_go()/xce_core_end_session() (new core_session.c): xce_core_go() is non-blocking, performs begin-session state reset (select-eval-ctx, resval resets), signals the picker thread via wbuf, and returns -EINVAL on a reentrant call while a session is already active (proven a true no-op, not just an early return). Draining core->decisions and invoking the driver's on_decision callback is the driver's own responsibility between core_go() and core_end_session() (confirmed driver-owned, not core-owned, per the Driver <-> Core protocol). xce_core_set_decision_cb() registers the callback + driver context as a separate setter, keeping xce_sched_core_init()'s live sched_init() call site untouched. Adds XCE_DECISION_PREEMPT to decision.h (jobid/victims[]/reason) alongside the existing DISPATCH/ PEND types. Additive only — sched_go/sched_begin_session/ sched_end_session/sched_allocator/main.c remain untouched. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019dw5WnN3DXStaEaPYfACU1
This commit is contained in:
parent
e6c0a2448a
commit
de69b6288d
9 changed files with 900 additions and 26 deletions
|
|
@ -9,18 +9,47 @@ typedef enum {
|
|||
XCE_DECISION_NONE = 0,
|
||||
XCE_DECISION_DISPATCH,
|
||||
XCE_DECISION_PEND,
|
||||
XCE_DECISION_NEW_SESSION
|
||||
XCE_DECISION_NEW_SESSION,
|
||||
XCE_DECISION_PREEMPT
|
||||
} xce_decision_op_t;
|
||||
|
||||
/*
|
||||
* xce_preempt_victim_t / xce_preempt_t - PREEMPT decision payload
|
||||
* (scheduler-core spec, task 4.4, Req 5 AC 6). Scheduler-owned (not
|
||||
* xce/types.h): design.md's Boundary Commitments note that the PREEMPT
|
||||
* wire shape is owned by this spec while victim-*selection* semantics
|
||||
* belong to the (separate, not-yet-implemented) scheduler-preemption spec
|
||||
* -- so these two structs carry exactly AC 6's field list ("jobid,
|
||||
* victims[] (jobid, workerid per victim), reason") and nothing more.
|
||||
*
|
||||
* `victims` follows the same "int count; T** items" idiom as
|
||||
* xce_job_dispatch_t.allocs / xce_preason_set_t.reasons (xce/types.h) --
|
||||
* an array of pointers, not a flat array, for consistency with every other
|
||||
* decision-adjacent list in this codebase.
|
||||
*/
|
||||
typedef struct {
|
||||
uint64_t jobid;
|
||||
char* workerid;
|
||||
} xce_preempt_victim_t;
|
||||
|
||||
typedef struct {
|
||||
uint64_t jobid;
|
||||
int nvictims;
|
||||
xce_preempt_victim_t** victims;
|
||||
xce_pendreason_t* reason;
|
||||
} xce_preempt_t;
|
||||
|
||||
typedef struct {
|
||||
xce_decision_op_t op;
|
||||
union {
|
||||
xce_job_alloc_t* alloc;
|
||||
xce_pendreason_t* reason;
|
||||
xce_preempt_t* preempt;
|
||||
} u;
|
||||
} xce_decision_t;
|
||||
|
||||
extern xce_decision_t* make_pend_decision(xce_pendreason_t*);
|
||||
extern xce_decision_t* make_dispatch_decision(xce_job_alloc_t*);
|
||||
extern xce_decision_t* make_preempt_decision(xce_preempt_t*);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue