]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Loop run waits until pingers finish
authorMaria Matejka <mq@ucw.cz>
Fri, 17 May 2024 21:21:38 +0000 (23:21 +0200)
committerMaria Matejka <mq@ucw.cz>
Sat, 18 May 2024 13:50:03 +0000 (15:50 +0200)
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).

sysdep/unix/io-loop.c

index 5d73b445e9762451d6337effff34eb3b07827f9e..96aab7e6a09ab302d8126f20b99a879e426bd53e 100644 (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)