From 4e8eb6a59549e82468d0aa6fbd0fa351e7e5d1fb Mon Sep 17 00:00:00 2001 From: Nick Mathewson Date: Fri, 9 Sep 2011 20:53:30 -0400 Subject: [PATCH] When a signal callback is activated to run multiple times, allow event_base_loopbreak to work even before they all have run. Found by Abilio Marques. --- event.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/event.c b/event.c index e331331d..ae105f4e 100644 --- a/event.c +++ b/event.c @@ -1024,6 +1024,7 @@ static inline void event_signal_closure(struct event_base *base, struct event *ev) { short ncalls; + int should_break; /* Allows deletes to work */ ncalls = ev->ev_ncalls; @@ -1035,11 +1036,13 @@ event_signal_closure(struct event_base *base, struct event *ev) if (ncalls == 0) ev->ev_pncalls = NULL; (*ev->ev_callback)((int)ev->ev_fd, ev->ev_res, ev->ev_arg); -#if 0 - /* XXXX we can't do this without a lock on the base. */ - if (base->event_break) + + EVBASE_ACQUIRE_LOCK(base, th_base_lock); + should_break = base->event_break; + EVBASE_RELEASE_LOCK(base, th_base_lock); + + if (should_break) return; -#endif } }