diff --git a/src/base/base_async.c b/src/base/base_async.c index bd28e236..da83d3e5 100644 --- a/src/base/base_async.c +++ b/src/base/base_async.c @@ -39,44 +39,43 @@ void AsyncWorkerEntryPoint(WaveLaneCtx *lane) AsyncTickCtx tick = ZI; tick.arena = AcquireArena(Gibi(64)); - i64 last_signal = 0; - /* Tick forever */ for (;;) { AsyncWorkerCtx *w = &Base.async.worker; ////////////////////////////// - //- Wait for signal - - /* TODO: Passive ticks that run every N seconds */ - - i64 cur_signal = Atomic64Fetch(&Base.async.signal.v); - while (cur_signal <= last_signal) - { - FutexYieldNeq(&Base.async.signal.v, &cur_signal, sizeof(cur_signal)); - cur_signal = Atomic64Fetch(&Base.async.signal.v); - } - last_signal = cur_signal; - - ////////////////////////////// - //- Collect async callbacks + //- Begin tick if (lane->idx == 0) { - Lock lock = LockE(&Base.async.mutex); + /* Wait for signal */ { - w->callbacks_count = Base.async.callback_nodes_count; - w->callbacks = PushStructsNoZero(tick.arena, AsyncTickCallback, w->callbacks_count); - u64 callback_idx = 0; - for (AsyncTickCallbackNode *n = Base.async.first_callback_node; n; n = n->next) + i64 cur_signal = Atomic64Fetch(&Base.async.signal.v); + while (cur_signal <= w->last_seen_signal) { - w->callbacks[callback_idx] = n->callback; - ++callback_idx; + FutexYieldNeq(&Base.async.signal.v, &cur_signal, sizeof(cur_signal)); + cur_signal = Atomic64Fetch(&Base.async.signal.v); } + w->last_seen_signal = cur_signal; + } + /* Collect callbacks */ + { + Lock lock = LockE(&Base.async.mutex); + { + w->callbacks_count = Base.async.callback_nodes_count; + w->callbacks = PushStructsNoZero(tick.arena, AsyncTickCallback, w->callbacks_count); + u64 callback_idx = 0; + for (AsyncTickCallbackNode *n = Base.async.first_callback_node; n; n = n->next) + { + w->callbacks[callback_idx] = n->callback; + ++callback_idx; + } + } + Unlock(&lock); } - Unlock(&lock); } + WaveSync(lane); ////////////////////////////// diff --git a/src/base/base_async.h b/src/base/base_async.h index 64514fb5..6432f8a1 100644 --- a/src/base/base_async.h +++ b/src/base/base_async.h @@ -22,6 +22,8 @@ Struct(AsyncTickCtx) Struct(AsyncWorkerCtx) { + i64 last_seen_signal; + u64 callbacks_count; AsyncTickCallback *callbacks; }; @@ -34,7 +36,6 @@ Struct(AsyncCtx) AsyncTickCallbackNode *last_callback_node; AsyncWorkerCtx worker; - Atomic64Padded signal; };