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:
parent
67f6ac1628
commit
4b9d12708e
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user