only wait for async signal on first lane
This commit is contained in:
parent
a2226a2fb8
commit
778651411a
@ -39,44 +39,43 @@ void AsyncWorkerEntryPoint(WaveLaneCtx *lane)
|
|||||||
AsyncTickCtx tick = ZI;
|
AsyncTickCtx tick = ZI;
|
||||||
tick.arena = AcquireArena(Gibi(64));
|
tick.arena = AcquireArena(Gibi(64));
|
||||||
|
|
||||||
i64 last_signal = 0;
|
|
||||||
|
|
||||||
/* Tick forever */
|
/* Tick forever */
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
AsyncWorkerCtx *w = &Base.async.worker;
|
AsyncWorkerCtx *w = &Base.async.worker;
|
||||||
|
|
||||||
//////////////////////////////
|
//////////////////////////////
|
||||||
//- Wait for signal
|
//- Begin tick
|
||||||
|
|
||||||
/* 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
|
|
||||||
|
|
||||||
if (lane->idx == 0)
|
if (lane->idx == 0)
|
||||||
{
|
{
|
||||||
Lock lock = LockE(&Base.async.mutex);
|
/* Wait for signal */
|
||||||
{
|
{
|
||||||
w->callbacks_count = Base.async.callback_nodes_count;
|
i64 cur_signal = Atomic64Fetch(&Base.async.signal.v);
|
||||||
w->callbacks = PushStructsNoZero(tick.arena, AsyncTickCallback, w->callbacks_count);
|
while (cur_signal <= w->last_seen_signal)
|
||||||
u64 callback_idx = 0;
|
|
||||||
for (AsyncTickCallbackNode *n = Base.async.first_callback_node; n; n = n->next)
|
|
||||||
{
|
{
|
||||||
w->callbacks[callback_idx] = n->callback;
|
FutexYieldNeq(&Base.async.signal.v, &cur_signal, sizeof(cur_signal));
|
||||||
++callback_idx;
|
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);
|
WaveSync(lane);
|
||||||
|
|
||||||
//////////////////////////////
|
//////////////////////////////
|
||||||
|
|||||||
@ -22,6 +22,8 @@ Struct(AsyncTickCtx)
|
|||||||
|
|
||||||
Struct(AsyncWorkerCtx)
|
Struct(AsyncWorkerCtx)
|
||||||
{
|
{
|
||||||
|
i64 last_seen_signal;
|
||||||
|
|
||||||
u64 callbacks_count;
|
u64 callbacks_count;
|
||||||
AsyncTickCallback *callbacks;
|
AsyncTickCallback *callbacks;
|
||||||
};
|
};
|
||||||
@ -34,7 +36,6 @@ Struct(AsyncCtx)
|
|||||||
AsyncTickCallbackNode *last_callback_node;
|
AsyncTickCallbackNode *last_callback_node;
|
||||||
|
|
||||||
AsyncWorkerCtx worker;
|
AsyncWorkerCtx worker;
|
||||||
|
|
||||||
Atomic64Padded signal;
|
Atomic64Padded signal;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user