From: Maria Matejka Date: Fri, 17 May 2024 21:21:38 +0000 (+0200) Subject: Loop run waits until pingers finish X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=48d090aacc76e6f9f9d2f18b7fa728565c6785c8;p=thirdparty%2Fbird.git 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). --- diff --git a/sysdep/unix/io-loop.c b/sysdep/unix/io-loop.c index be79946c6..f777d210e 100644 --- a/sysdep/unix/io-loop.c +++ b/sysdep/unix/io-loop.c @@ -1449,6 +1449,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)