only wait for async signal on first lane

This commit is contained in:
jacob 2025-12-16 14:26:20 -06:00
parent a2226a2fb8
commit 778651411a
2 changed files with 25 additions and 25 deletions

View File

@ -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);
//////////////////////////////

View File

@ -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;
};