mirror of
https://gitlab.nic.cz/labs/bird.git
synced 2024-11-08 12:18:42 +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);
|
account_to(&loop->locking);
|
||||||
birdloop_enter(loop);
|
birdloop_enter(loop);
|
||||||
this_birdloop = 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);
|
u64 dif = account_to(&loop->working);
|
||||||
|
|
||||||
if (dif > this_thread->max_loop_time_ns)
|
if (dif > this_thread->max_loop_time_ns)
|
||||||
|
Loading…
Reference in New Issue
Block a user