21#ifdef XTC_ENABLE_SCHED_POLICY
97 _Atomic(xtc_timer_t *) park_timer;
152 _Atomic uint32_t wake_revents;
161 _Atomic
int wake_pending;
181 void (*cleanup)(
void *cleanup_arg);
223#define XTC_TIMER_FIRED 1
224#define XTC_TIMER_CANCELLED 2
236 _Atomic
int cancelled;
272 _Atomic(
struct xtc_task *) pub_head;
273 _Atomic(
struct xtc_task *) wake_head;
278 _Atomic
int sleeping;
315#define XTC_LOOP_MAX_CLASSES 16
322#define XTC_DEFAULT_CLASS_SHARES 100
323#define XTC_DEFAULT_CLASS_RECIP (((uint64_t)1 << 22) / XTC_DEFAULT_CLASS_SHARES)
331#define XTC_VRUNTIME_MIN_QUANTUM_NS 1000
333#ifndef XTC_LOOP_STACK_SPARE
334#define XTC_LOOP_STACK_SPARE 64
338#ifdef XTC_ENABLE_SCHED_POLICY
339 struct xtc_sched_state sched;
360 xtc_timer_t *all_timers;
365 struct xtc_slab *timer_slab;
387 _Atomic
int n_mig_alive;
388 _Atomic
int steal_sleep;
395 _Atomic uint64_t n_tasks_run;
396 _Atomic uint64_t n_steals;
403 unsigned int runs_since_poll;
412 unsigned int pop_flip;
413 _Atomic
int n_timers_pub;
419 int64_t yield_budget_ns;
420 _Atomic uint64_t n_yield_due;
437 uint64_t default_vruntime;
442 int64_t class_latency_ns;
450 int64_t stall_budget_ns;
451 void (*stall_cb)(xtc_loop_t *loop, xtc_task_t *task,
452 int64_t ran_ns, int64_t budget_ns,
455 _Atomic uint64_t n_stalls;
465 _Atomic
int stop_requested;
477 struct xtc_exec *exec;
487#if defined(XTC_DIAGNOSTIC)
511 _Atomic(
struct xtc_task *) dead_head;
522 _Atomic
int task_spare_lock;
524 _Atomic
int task_spare_n;
536 _Atomic
int stack_spare_want;
537 _Atomic
int stack_spare_lock;
538 _Atomic
int stack_spare_n;
539 size_t stack_spare_sz;
540 void *stack_spare[XTC_LOOP_STACK_SPARE];
543#if defined(XTC_DIAGNOSTIC)
555void __xtc_loop_owner_violation(
const struct xtc_loop *loop,
const char *site);
556extern XTC_THREAD_LOCAL
struct xtc_loop *__xtc_current_loop;
557extern int __xtc_sim_active(
void);
558#define XTC_ASSERT_LOOP_OWNER(loop, site) \
560 const struct xtc_loop *_l = (loop); \
563 if (__xtc_sim_active()) { \
573 if (__xtc_current_loop != NULL && \
574 __xtc_current_loop != _l) \
575 __xtc_loop_owner_violation(_l, (site)); \
576 } else if (_l->owner_set && \
577 !pthread_equal(pthread_self(), _l->owner_tid)) { \
578 __xtc_loop_owner_violation(_l, (site)); \
582#define XTC_ASSERT_LOOP_OWNER(loop, site) ((void)0)
586int __xtc_loop_enqueue(xtc_loop_t *loop, xtc_task_t *t);
591int __xtc_loop_class_create(xtc_loop_t *loop,
int shares,
592 int64_t latency_ns,
int *out_idx);
595int __xtc_task_spawn_ex(xtc_loop_t *loop, xtc_task_fn fn,
void *user,
596 int pinned, xtc_task_t **out_task);
598void __xtc_task_reclaim(xtc_loop_t *loop, xtc_task_t *t);
599void __xtc_task_reclaim_drain(xtc_loop_t *loop);
601void __xtc_task_spare_fini(xtc_loop_t *loop);
602int __xtc_task_spawn_cleanup(xtc_loop_t *loop, xtc_task_fn fn,
void *user,
603 int pinned,
void (*cleanup)(
void *),
void *cleanup_arg,
604 xtc_task_t **out_task);
605int __xtc_timer_heap_push(xtc_loop_t *loop, xtc_timer_t *t);
606xtc_timer_t *__xtc_timer_heap_pop_due(xtc_loop_t *loop, int64_t now_ns);
614void __xtc_timer_park_release(xtc_timer_t *t);
617int __xtc_timer_try_cancel(xtc_timer_t *t);
618int64_t __xtc_timer_heap_next_deadline(xtc_loop_t *loop);
619void __xtc_task_cancel_park_timer(xtc_task_t *self);
620int __xtc_loop_dispatch_event(xtc_loop_t *loop,
xtc_io_event_t *ev);
629int __xtc_io_uring_preempt_arm(xtc_io_t *io, int64_t interval_ns);
630int __xtc_io_uring_preempt_due(xtc_io_t *io);
631void __xtc_io_uring_preempt_disarm(xtc_io_t *io);
633void __xtc_io_owner_leave(xtc_io_t *io);
637void __xtc_io_flush(xtc_io_t *io);
642void __xtc_proc_loop_unregister(xtc_loop_t *loop);
645int __xtc_inbox_init(
struct xtc_inbox *ib);
646void __xtc_inbox_fini(
struct xtc_inbox *ib);
647int __xtc_inbox_push(xtc_loop_t *loop,
enum xtc_inbox_kind k, xtc_task_t *t);
648int __xtc_inbox_nonempty(
const struct xtc_inbox *ib);
649int __xtc_inbox_drain(xtc_loop_t *loop);
653int __xtc_inbox_sleep_begin(xtc_loop_t *loop);
654void __xtc_inbox_sleep_end(xtc_loop_t *loop);
658extern XTC_THREAD_LOCAL xtc_loop_t *__xtc_current_loop;
665xtc_loop_t *__xtc_current_loop_get(
void);
678extern void *(*__xtc_fiber_ctx_save)(void);
679extern void (*__xtc_fiber_ctx_restore)(
void *);
689extern void (*__xtc_fiber_kill_check)(void);
696extern void (*__xtc_fiber_kill_poll)(void);
704extern void (*__xtc_loop_fini_hook)(xtc_loop_t *loop);