mirror of
https://gitlab.nic.cz/labs/bird.git
synced 2024-12-22 01:31:55 +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
65be42269d
commit
48d090aacc
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user