diff options
author | Nick Mathewson <nickm@torproject.org> | 2010-11-25 23:03:46 -0500 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2010-11-25 23:03:46 -0500 |
commit | 2e5a175bf387bd5c80b88f276b4ba7dcf9eaaf08 (patch) | |
tree | bbd2b023ace82723620956f6d0d84061e9babfd5 /event.c | |
parent | 32390732d75d1d4680a562404ef4298869f37b12 (diff) | |
parent | 057a51468e1368384478788800f66c6d82e2bce3 (diff) | |
download | libevent-2e5a175bf387bd5c80b88f276b4ba7dcf9eaaf08.tar.gz |
Merge remote branch 'github/20_once_fixes'
Diffstat (limited to 'event.c')
-rw-r--r-- | event.c | 15 |
1 files changed, 9 insertions, 6 deletions
@@ -134,7 +134,7 @@ static void event_queue_insert(struct event_base *, struct event *, int); static void event_queue_remove(struct event_base *, struct event *, int); static int event_haveevents(struct event_base *); -static void event_process_active(struct event_base *); +static int event_process_active(struct event_base *); static int timeout_next(struct event_base *, struct timeval **); static void timeout_process(struct event_base *); @@ -1341,19 +1341,19 @@ event_process_deferred_callbacks(struct deferred_cb_queue *queue, int *breakptr) * priority ones. */ -static void +static int event_process_active(struct event_base *base) { /* Caller must hold th_base_lock */ struct event_list *activeq = NULL; - int i, c; + int i, c = 0; for (i = 0; i < base->nactivequeues; ++i) { if (TAILQ_FIRST(&base->activequeues[i]) != NULL) { activeq = &base->activequeues[i]; c = event_process_active_single_queue(base, activeq); if (c < 0) - return; + return -1; else if (c > 0) break; /* Processed a real event; do not * consider lower-priority events */ @@ -1363,6 +1363,7 @@ event_process_active(struct event_base *base) } event_process_deferred_callbacks(&base->defer_queue,&base->event_break); + return c; } /* @@ -1547,8 +1548,10 @@ event_base_loop(struct event_base *base, int flags) timeout_process(base); if (N_ACTIVE_CALLBACKS(base)) { - event_process_active(base); - if (!base->event_count_active && (flags & EVLOOP_ONCE)) + int n = event_process_active(base); + if ((flags & EVLOOP_ONCE) + && N_ACTIVE_CALLBACKS(base) == 0 + && n != 0) done = 1; } else if (flags & EVLOOP_NONBLOCK) done = 1; |