From 84fd6d750642ff88ba5ab3e6b3f6fbba7868698c Mon Sep 17 00:00:00 2001 From: Roman Puls Date: Fri, 7 Sep 2012 09:47:50 -0400 Subject: [PATCH] Expose event_base_foreach_event() as a public API. --- event-internal.h | 2 +- event.c | 21 ++++++++++++++++++--- evmap.c | 4 ++-- include/event2/event.h | 21 +++++++++++++++++++++ 4 files changed, 42 insertions(+), 6 deletions(-) diff --git a/event-internal.h b/event-internal.h index 112821da..5372af88 100644 --- a/event-internal.h +++ b/event-internal.h @@ -401,7 +401,7 @@ void event_base_assert_ok_nolock_(struct event_base *base); /* Callback type for event_base_foreach_event. */ -typedef int (*event_base_foreach_event_cb)(struct event_base *base, struct event *, void *); +//typedef int (*event_base_foreach_event_cb)(struct event_base *base, struct event *, void *); /* Helper function: Call 'fn' exactly once every inserted or active event in * the event_base 'base'. diff --git a/event.c b/event.c index 79664d48..2e1676ce 100644 --- a/event.c +++ b/event.c @@ -3194,7 +3194,7 @@ evthread_make_base_notifiable_nolock_(struct event_base *base) int event_base_foreach_event_(struct event_base *base, - int (*fn)(struct event_base *, struct event *, void *), void *arg) + event_base_foreach_event_cb fn, void *arg) { int r, i; unsigned u; @@ -3255,7 +3255,7 @@ event_base_foreach_event_(struct event_base *base, /* Helper for event_base_dump_events: called on each event in the event base; * dumps only the inserted events. */ static int -dump_inserted_event_fn(struct event_base *base, struct event *e, void *arg) +dump_inserted_event_fn(const struct event_base *base, const struct event *e, void *arg) { FILE *output = arg; const char *gloss = (e->ev_events & EV_SIGNAL) ? @@ -3287,7 +3287,7 @@ dump_inserted_event_fn(struct event_base *base, struct event *e, void *arg) /* Helper for event_base_dump_events: called on each event in the event base; * dumps only the active events. */ static int -dump_active_event_fn(struct event_base *base, struct event *e, void *arg) +dump_active_event_fn(const struct event_base *base, const struct event *e, void *arg) { FILE *output = arg; const char *gloss = (e->ev_events & EV_SIGNAL) ? @@ -3308,14 +3308,29 @@ dump_active_event_fn(struct event_base *base, struct event *e, void *arg) return 0; } +void +event_base_foreach_event(struct event_base *base, + event_base_foreach_event_cb fn, void *arg) +{ + if ((!fn) || (!base)) { + return; + } + EVBASE_ACQUIRE_LOCK(base, th_base_lock); + event_base_foreach_event_(base, fn, arg); + EVBASE_RELEASE_LOCK(base, th_base_lock); +} + + void event_base_dump_events(struct event_base *base, FILE *output) { + EVBASE_ACQUIRE_LOCK(base, th_base_lock); fprintf(output, "Inserted events:\n"); event_base_foreach_event_(base, dump_inserted_event_fn, output); fprintf(output, "Active events:\n"); event_base_foreach_event_(base, dump_active_event_fn, output); + EVBASE_RELEASE_LOCK(base, th_base_lock); } void diff --git a/evmap.c b/evmap.c index 62ecb7b3..e02e4e91 100644 --- a/evmap.c +++ b/evmap.c @@ -963,7 +963,7 @@ evmap_check_integrity_(struct event_base *base) /* Helper type for evmap_foreach_event_: Bundles a function to call on every * event, and the user-provided void* to use as its third argument. */ struct evmap_foreach_event_helper { - int (*fn)(struct event_base *, struct event *, void *); + int (*fn)(const struct event_base *, const struct event *, void *); void *arg; }; @@ -1001,7 +1001,7 @@ evmap_signal_foreach_event_fn(struct event_base *base, int signum, int evmap_foreach_event_(struct event_base *base, - int (*fn)(struct event_base *, struct event *, void *), void *arg) + int (*fn)(const struct event_base *, const struct event *, void *), void *arg) { struct evmap_foreach_event_helper h; int r; diff --git a/include/event2/event.h b/include/event2/event.h index c2f65c92..503b9de1 100644 --- a/include/event2/event.h +++ b/include/event2/event.h @@ -1325,6 +1325,27 @@ void event_set_mem_functions( */ void event_base_dump_events(struct event_base *, FILE *); + +/** + * callback for iterating events in an event base via event_base_foreach_event + */ +typedef int (*event_base_foreach_event_cb)(const struct event_base *, const struct event *, void *); + +/** + Iterate all current events in a given event loop. The method is an + alternative to event_base_dump_events, but provides a native interface + towards the events. + + Modification of events during iteration is an invalid operation + and may lead to unexpected behaviour + + @param base An event_base on which to scan the events. + @param fn A callback function to receive the events. +*/ +void event_base_foreach_event(struct event_base *base, event_base_foreach_event_cb fn, void *arg); + + + /** Sets 'tv' to the current time (as returned by gettimeofday()), looking at the cached value in 'base' if possible, and calling gettimeofday() or clock_gettime() as appropriate if there is no