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 *);
* 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 */
}
event_process_deferred_callbacks(&base->defer_queue,&base->event_break);
+ return c;
}
/*
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)
+ && base->event_count_active == 0
+ && n != 0)
done = 1;
} else if (flags & EVLOOP_NONBLOCK)
done = 1;