only wait for async signal on first lane
This commit is contained in:
parent
a2226a2fb8
commit
778651411a
@ -39,30 +39,27 @@ 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 */
|
||||
//- Begin tick
|
||||
|
||||
if (lane->idx == 0)
|
||||
{
|
||||
/* Wait for signal */
|
||||
{
|
||||
i64 cur_signal = Atomic64Fetch(&Base.async.signal.v);
|
||||
while (cur_signal <= last_signal)
|
||||
while (cur_signal <= w->last_seen_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)
|
||||
w->last_seen_signal = cur_signal;
|
||||
}
|
||||
/* Collect callbacks */
|
||||
{
|
||||
Lock lock = LockE(&Base.async.mutex);
|
||||
{
|
||||
@ -77,6 +74,8 @@ void AsyncWorkerEntryPoint(WaveLaneCtx *lane)
|
||||
}
|
||||
Unlock(&lock);
|
||||
}
|
||||
}
|
||||
|
||||
WaveSync(lane);
|
||||
|
||||
//////////////////////////////
|
||||
|
||||
@ -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;
|
||||
};
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user