30#define SRN_MUTEX_HELD_WITH_NO_WAITER (&srn_mutex_held_marker)
43 srn_fiber_t *cur = atomic_load_explicit(&m->state, memory_order_acquire);
50 atomic_compare_exchange_weak_explicit(
66 atomic_compare_exchange_weak_explicit(
67 &m->state, &cur, self, memory_order_release, memory_order_acquire
77 atomic_init(&m->state,
nullptr);
85 atomic_compare_exchange_strong_explicit(
110 srn_fiber_t *cur = atomic_load_explicit(&m->state, memory_order_relaxed);
115 atomic_compare_exchange_weak_explicit(
116 &m->state, &cur,
nullptr, memory_order_release, memory_order_relaxed
128 atomic_compare_exchange_weak_explicit(
AI Generated (🤦) Fiber subsystem overview.
void srn_fiber_mutex_init(srn_fiber_mutex_t *m)
Initialise m to the unlocked state.
void srn_fiber_mutex_unlock(srn_fiber_mutex_t *m)
Release m.
static bool srn_fiber_mutex_suspend(srn_fiber_t *self, void *arg)
Suspend commit function for a contended srn_fiber_mutex_lock.
static srn_fiber_t srn_mutex_held_marker
Marker stored in srn_fiber_mutex_t.state to mean the lock is held with no waiter queued.
void srn_fiber_mutex_lock(srn_fiber_mutex_t *m)
Acquire m.
#define SRN_MUTEX_HELD_WITH_NO_WAITER
void srn_fiber_ready(srn_fiber_t *fiber)
Mark a suspended fiber runnable again, waking it when the event it awaited occurs.
void srn_fiber_suspend(srn_fiber_park_fn commit, void *arg)
A suspended fiber is on no scheduler queue, and the scheduler does not track what it waits on – whoev...
srn_fiber_t * waiters_head
A private (In the sense that it only touched only by the current lock holder during unlock) pointer t...
srn_fiber_t * link
Intrusive link threading this fiber onto one of the scheduler's singly-linked lists (the ready run qu...