0
0
mirror of https://gitlab.nic.cz/labs/bird.git synced 2024-12-23 02:01:55 +00:00

Event: fixed race condition between ev_send and ev_postpone

This commit is contained in:
Maria Matejka 2024-02-27 14:25:04 +01:00
parent 418578bc6b
commit 85c144f8ac

View File

@ -160,7 +160,11 @@ ev_postpone(event *e)
ASSERT_DIE(birdloop_inside(sl->loop)); ASSERT_DIE(birdloop_inside(sl->loop));
/* Remove from one of these lists. */ /* Remove from one of these lists. */
ASSERT(ev_remove_from(e, &sl->_executor) || ev_remove_from(e, &sl->receiver)); while (
!ev_remove_from(e, &sl->_executor) &&
!ev_remove_from(e, &sl->receiver))
/* We may need to wait until the sender actually puts the event inside */
birdloop_yield();
/* Mark as inactive */ /* Mark as inactive */
ASSERT_DIE(sl == atomic_exchange_explicit(&e->list, NULL, memory_order_acq_rel)); ASSERT_DIE(sl == atomic_exchange_explicit(&e->list, NULL, memory_order_acq_rel));
@ -242,7 +246,7 @@ ev_send(event_list *l, event *e)
else else
bug("Queuing an already queued event to another queue is not supported."); bug("Queuing an already queued event to another queue is not supported.");
/* Here should be no concurrent senders */ /* Here should be no concurrent senders of this event */
event *next = atomic_load_explicit(&l->receiver, memory_order_acquire); event *next = atomic_load_explicit(&l->receiver, memory_order_acquire);
edlog(l, e, next, 2, EDL_SEND); edlog(l, e, next, 2, EDL_SEND);
event *old_next = NULL; event *old_next = NULL;