summaryrefslogtreecommitdiff
path: root/event.c
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2010-11-25 23:03:46 -0500
committerNick Mathewson <nickm@torproject.org>2010-11-25 23:03:46 -0500
commit2e5a175bf387bd5c80b88f276b4ba7dcf9eaaf08 (patch)
treebbd2b023ace82723620956f6d0d84061e9babfd5 /event.c
parent32390732d75d1d4680a562404ef4298869f37b12 (diff)
parent057a51468e1368384478788800f66c6d82e2bce3 (diff)
downloadlibevent-2e5a175bf387bd5c80b88f276b4ba7dcf9eaaf08.tar.gz
Merge remote branch 'github/20_once_fixes'
Diffstat (limited to 'event.c')
-rw-r--r--event.c15
1 files changed, 9 insertions, 6 deletions
diff --git a/event.c b/event.c
index d3394b1d..0e711c81 100644
--- a/event.c
+++ b/event.c
@@ -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;