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).
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)