0
0
mirror of https://gitlab.nic.cz/labs/bird.git synced 2024-12-22 09:41:54 +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 65be42269d
commit 48d090aacc

View File

@ -1449,6 +1449,17 @@ birdloop_run(void *_loop)
account_to(&loop->locking); account_to(&loop->locking);
birdloop_enter(loop); birdloop_enter(loop);
this_birdloop = 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); u64 dif = account_to(&loop->working);
if (dif > this_thread->max_loop_time_ns) if (dif > this_thread->max_loop_time_ns)