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.
This commit is contained in:
Nick Mathewson 2011-09-09 20:53:30 -04:00
parent f72e8f6643
commit 4e8eb6a595

11
event.c
View File

@ -1024,6 +1024,7 @@ static inline void
event_signal_closure(struct event_base *base, struct event *ev) event_signal_closure(struct event_base *base, struct event *ev)
{ {
short ncalls; short ncalls;
int should_break;
/* Allows deletes to work */ /* Allows deletes to work */
ncalls = ev->ev_ncalls; ncalls = ev->ev_ncalls;
@ -1035,11 +1036,13 @@ event_signal_closure(struct event_base *base, struct event *ev)
if (ncalls == 0) if (ncalls == 0)
ev->ev_pncalls = NULL; ev->ev_pncalls = NULL;
(*ev->ev_callback)((int)ev->ev_fd, ev->ev_res, ev->ev_arg); (*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. */ EVBASE_ACQUIRE_LOCK(base, th_base_lock);
if (base->event_break) should_break = base->event_break;
EVBASE_RELEASE_LOCK(base, th_base_lock);
if (should_break)
return; return;
#endif
} }
} }