73 xtc_timer_t *park_timer;
92 _Atomic uint32_t wake_revents;
101 _Atomic
int wake_pending;
121 void (*cleanup)(
void *cleanup_arg);
159 enum xtc_inbox_kind kind;
204#define XTC_LOOP_MAX_CLASSES 16
211#define XTC_DEFAULT_CLASS_SHARES 100
212#define XTC_DEFAULT_CLASS_RECIP (((uint64_t)1 << 22) / XTC_DEFAULT_CLASS_SHARES)
220#define XTC_VRUNTIME_MIN_QUANTUM_NS 1000
233 xtc_timer_t **timers;
241 xtc_timer_t *all_timers;
246 struct xtc_slab *timer_slab;
267 _Atomic uint64_t n_tasks_run;
268 _Atomic uint64_t n_steals;
275 unsigned int runs_since_poll;
281 int64_t yield_budget_ns;
282 _Atomic uint64_t n_yield_due;
299 uint64_t default_vruntime;
304 int64_t class_latency_ns;
312 int64_t stall_budget_ns;
313 void (*stall_cb)(xtc_loop_t *loop, xtc_task_t *task,
314 int64_t ran_ns, int64_t budget_ns,
317 _Atomic uint64_t n_stalls;
327 _Atomic
int stop_requested;
338 struct xtc_exec *exec;
348#if defined(XTC_DIAGNOSTIC)
367#if defined(XTC_DIAGNOSTIC)
379void __xtc_loop_owner_violation(
const struct xtc_loop *loop,
const char *site);
380extern XTC_THREAD_LOCAL
struct xtc_loop *__xtc_current_loop;
381extern int __xtc_sim_active(
void);
382#define XTC_ASSERT_LOOP_OWNER(loop, site) \
384 const struct xtc_loop *_l = (loop); \
387 if (__xtc_sim_active()) { \
397 if (__xtc_current_loop != NULL && \
398 __xtc_current_loop != _l) \
399 __xtc_loop_owner_violation(_l, (site)); \
400 } else if (_l->owner_set && \
401 !pthread_equal(pthread_self(), _l->owner_tid)) { \
402 __xtc_loop_owner_violation(_l, (site)); \
406#define XTC_ASSERT_LOOP_OWNER(loop, site) ((void)0)
410int __xtc_loop_enqueue(xtc_loop_t *loop, xtc_task_t *t);
415int __xtc_loop_class_create(xtc_loop_t *loop,
int shares,
416 int64_t latency_ns,
int *out_idx);
419int __xtc_task_spawn_ex(xtc_loop_t *loop, xtc_task_fn fn,
void *user,
420 int pinned, xtc_task_t **out_task);
421int __xtc_timer_heap_push(xtc_loop_t *loop, xtc_timer_t *t);
422xtc_timer_t *__xtc_timer_heap_pop_due(xtc_loop_t *loop, int64_t now_ns);
423int64_t __xtc_timer_heap_next_deadline(xtc_loop_t *loop);
424void __xtc_task_cancel_park_timer(xtc_task_t *self);
425int __xtc_loop_dispatch_event(xtc_loop_t *loop,
xtc_io_event_t *ev);
434int __xtc_io_uring_preempt_arm(xtc_io_t *io, int64_t interval_ns);
435int __xtc_io_uring_preempt_due(xtc_io_t *io);
436void __xtc_io_uring_preempt_disarm(xtc_io_t *io);
441void __xtc_proc_loop_unregister(xtc_loop_t *loop);
443int __xtc_inbox_init(
struct xtc_inbox *ib);
444void __xtc_inbox_fini(
struct xtc_inbox *ib);
445int __xtc_inbox_push(
struct xtc_inbox *ib,
enum xtc_inbox_kind k, xtc_task_t *t);
446int __xtc_inbox_drain(xtc_loop_t *loop);
450extern XTC_THREAD_LOCAL xtc_loop_t *__xtc_current_loop;
463extern void *(*__xtc_fiber_ctx_save)(void);
464extern void (*__xtc_fiber_ctx_restore)(
void *);
474extern void (*__xtc_fiber_kill_check)(void);
482extern void (*__xtc_loop_fini_hook)(xtc_loop_t *loop);