From: John Ohl Date: Mon, 27 Jan 2014 18:03:36 +0000 (-0500) Subject: Tweaked callbacks to prevent race condition (https://github.com/libevent/libevent... X-Git-Tag: release-2.1.4-alpha~32 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=40830f16445d036728313c70816f2bfa2d9333e0;p=libevent Tweaked callbacks to prevent race condition (https://github.com/libevent/libevent/issues/104) --- diff --git a/event.c b/event.c index c946cbf9..b97f1dbf 100644 --- a/event.c +++ b/event.c @@ -1495,8 +1495,15 @@ event_persist_closure(struct event_base *base, struct event *ev) run_at.tv_usec |= usec_mask; event_add_nolock_(ev, &run_at, 1); } - EVBASE_RELEASE_LOCK(base, th_base_lock); - (*ev->ev_callback)(ev->ev_fd, ev->ev_res, ev->ev_arg); + + // Get our callback before we release the lock + void (*evcb_callback)(evutil_socket_t, short, void *) = *ev->ev_callback; + + // Release the lock + EVBASE_RELEASE_LOCK(base, th_base_lock); + + // Execute the callback + (evcb_callback)(ev->ev_fd, ev->ev_res, ev->ev_arg); } /*