From: Maria Matejka Date: Tue, 27 Feb 2024 13:25:04 +0000 (+0100) Subject: Event: fixed race condition between ev_send and ev_postpone X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d020cc7e26f5756dd5c27e1b5f5aa0a8f7db5e61;p=thirdparty%2Fbird.git Event: fixed race condition between ev_send and ev_postpone --- diff --git a/lib/event.c b/lib/event.c index 68888a4cd..1eb1ad0a0 100644 --- a/lib/event.c +++ b/lib/event.c @@ -160,7 +160,11 @@ ev_postpone(event *e) ASSERT_DIE(birdloop_inside(sl->loop)); /* 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 */ 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 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); edlog(l, e, next, 2, EDL_SEND); event *old_next = NULL;