0
0
mirror of https://gitlab.nic.cz/labs/bird.git synced 2024-11-09 20:58:44 +00:00

Loop run waits until pingers finish

This ensures that if somebody passes an event to a loop which
has just started executing, then the event gets picked up. Otherwise
there is a race condition causing stray events pending in queue
but without the ping (because the run actually finishes too fast
to pickup the later events).
This commit is contained in:
Maria Matejka 2024-05-17 23:21:38 +02:00
parent 67f6ac1628
commit 4b9d12708e

View File

@ -1472,6 +1472,17 @@ birdloop_run(void *_loop)
account_to(&loop->locking);
birdloop_enter(loop);
this_birdloop = loop;
/* Wait until pingers end to wait for all events to actually arrive */
for (u32 ltt;
ltt = atomic_load_explicit(&loop->thread_transition, memory_order_acquire);
)
{
ASSERT_DIE(ltt == LTT_PING);
birdloop_yield();
}
/* Now we can actually do some work */
u64 dif = account_to(&loop->working);
if (dif > this_thread->max_loop_time_ns)