ascii-chat 0.11.33
Video chat in your terminal
Loading...
Searching...
No Matches
lifecycle.c File Reference

Go to the source code of this file.

Functions

bool lifecycle_init (lifecycle_t *lc, const char *name)
 
bool lifecycle_init_once (lifecycle_t *lc)
 
void lifecycle_init_commit (lifecycle_t *lc)
 
void lifecycle_init_abort (lifecycle_t *lc)
 
bool lifecycle_shutdown (lifecycle_t *lc)
 
bool lifecycle_shutdown_forever (lifecycle_t *lc)
 
bool lifecycle_is_initialized (const lifecycle_t *lc)
 

Function Documentation

◆ lifecycle_init()

bool lifecycle_init ( lifecycle_t *  lc,
const char *  name 
)

CAS-based initialization: UNINIT → INITIALIZED.

Parameters
lclifecycle state (may include sync_type and sync pointer)
namename tag for any sync primitive (for debugging), or NULL if no sync
Returns
true if THIS caller won the race and should do init work
false if already INITIALIZED, INITIALIZING, or DEAD

Suitable for single-threaded startup or contexts where the caller guarantees serialization. If lc->sync_type != SYNC_NONE, initializes the sync primitive.

Definition at line 14 of file platform/wasm/lifecycle.c.

14 {
15 (void)name;
16 if (!lc)
17 return false;
18
19 // Only initialize if not already initialized (matches native CAS behavior)
20 int expected = LIFECYCLE_UNINITIALIZED;
21 return atomic_cas_int(&lc->state, &expected, LIFECYCLE_INITIALIZED);
22}
bool atomic_cas_int(atomic_t *a, int *expected, int new_value)
Atomically compare-and-swap an int.
Definition atomic.c:225
@ LIFECYCLE_INITIALIZED
Ready to use.
Definition lifecycle.h:43
@ LIFECYCLE_UNINITIALIZED
Not yet initialized (zero = default)
Definition lifecycle.h:41
atomic_t state
lifecycle_state_t enum value
Definition lifecycle.h:59

References atomic_cas_int(), LIFECYCLE_INITIALIZED, LIFECYCLE_UNINITIALIZED, and lifecycle_t::state.

◆ lifecycle_init_abort()

void lifecycle_init_abort ( lifecycle_t *  lc)

Abort failed initialization: INITIALIZING → UNINITIALIZED. Call this if lifecycle_init_once() returns true but init work fails.

Parameters
lclifecycle state

Allows the next caller to retry initialization. Wakes spinners.

Definition at line 39 of file platform/wasm/lifecycle.c.

39 {
40 if (!lc)
41 return;
43}
void atomic_store_int(atomic_t *a, int value)
Atomically store an int value.
Definition atomic.c:202

References atomic_store_int(), LIFECYCLE_UNINITIALIZED, and lifecycle_t::state.

◆ lifecycle_init_commit()

void lifecycle_init_commit ( lifecycle_t *  lc)

Commit successful initialization: INITIALIZING → INITIALIZED. Call this after lifecycle_init_once() returns true and init work succeeds.

Parameters
lclifecycle state

Wakes all spinners waiting in lifecycle_init_once(). Must be called by the lifecycle_init_once() winner after successful init work.

Definition at line 33 of file platform/wasm/lifecycle.c.

33 {
34 if (!lc)
35 return;
37}

References atomic_store_int(), LIFECYCLE_INITIALIZED, and lifecycle_t::state.

◆ lifecycle_init_once()

bool lifecycle_init_once ( lifecycle_t *  lc)

Lock-free concurrent initialization: CAS UNINIT → INITIALIZING.

Winner receives true and must complete the two-phase sequence:

  1. Do actual init work
  2. Call lifecycle_init_commit() on success or lifecycle_init_abort() on failure

Losing callers spin on the transient INITIALIZING state until the winner commits, then return false without doing work.

Parameters
lclifecycle state
Returns
true if THIS caller won the init race and should do work
false if init already happened (or is in progress) or module is DEAD

Safe for concurrent callers. Exactly one caller gets true (the CAS winner). Other concurrent callers spin until the winner moves to INITIALIZED or DEAD.

Definition at line 24 of file platform/wasm/lifecycle.c.

24 {
25 if (!lc)
26 return false;
27
28 // Try to transition from UNINITIALIZED to INITIALIZING
29 int expected = LIFECYCLE_UNINITIALIZED;
30 return atomic_cas_int(&lc->state, &expected, LIFECYCLE_INITIALIZING);
31}
@ LIFECYCLE_INITIALIZING
init_once winner in progress; losers spin
Definition lifecycle.h:42

References atomic_cas_int(), LIFECYCLE_INITIALIZING, LIFECYCLE_UNINITIALIZED, and lifecycle_t::state.

◆ lifecycle_is_initialized()

bool lifecycle_is_initialized ( const lifecycle_t *  lc)

Query: is module in INITIALIZED state?

Parameters
lclifecycle state
Returns
true if state == LIFECYCLE_INITIALIZED

Load-only, no side effects. Safe to call from any thread.

Definition at line 56 of file platform/wasm/lifecycle.c.

56 {
57 if (!lc) {
58 return false;
59 }
60
61 // WASM: Use non-tracking atomic load to avoid time_get_ns() which can block
62 // Simply read the state value without the atomic_on_load callback
63 int state = (int)(int32_t)atomic_load((const _Atomic(uint64_t) *)&lc->state);
64 bool result = state == LIFECYCLE_INITIALIZED;
65
66 return result;
67}
unsigned long long uint64_t
Definition common.h:59

References LIFECYCLE_INITIALIZED, and lifecycle_t::state.

◆ lifecycle_shutdown()

bool lifecycle_shutdown ( lifecycle_t *  lc)

Regular shutdown: INITIALIZED → UNINITIALIZED.

Parameters
lclifecycle state (may include sync_type and sync pointer)
Returns
true if THIS caller should do shutdown work
false if already UNINITIALIZED or DEAD

Allows re-initialization after shutdown (unlike shutdown_forever). If lc->sync_type != SYNC_NONE, destroys the sync primitive.

Definition at line 45 of file platform/wasm/lifecycle.c.

45 {
46 if (!lc)
47 return false;
49 return true;
50}

References atomic_store_int(), LIFECYCLE_UNINITIALIZED, and lifecycle_t::state.

Referenced by lifecycle_shutdown_forever().

◆ lifecycle_shutdown_forever()

bool lifecycle_shutdown_forever ( lifecycle_t *  lc)

Permanent shutdown: any non-DEAD → DEAD.

Parameters
lclifecycle state
Returns
true if module was INITIALIZED and caller should do shutdown work
false if already DEAD

Once DEAD, future init/init_once calls always return false. Spins if called while init_once is in progress (INITIALIZING state). Used for modules that must never be re-initialized.

Definition at line 52 of file platform/wasm/lifecycle.c.

52 {
53 return lifecycle_shutdown(lc);
54}
bool lifecycle_shutdown(lifecycle_t *lc)

References lifecycle_shutdown().