Expose event_base_foreach_event() as a public API.

This commit is contained in:
Roman Puls 2012-09-07 09:47:50 -04:00 committed by Nick Mathewson
parent e8faa2c74c
commit 84fd6d7506
4 changed files with 42 additions and 6 deletions

View File

@ -401,7 +401,7 @@ void event_base_assert_ok_nolock_(struct event_base *base);
/* Callback type for event_base_foreach_event. */ /* 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 /* Helper function: Call 'fn' exactly once every inserted or active event in
* the event_base 'base'. * the event_base 'base'.

21
event.c
View File

@ -3194,7 +3194,7 @@ evthread_make_base_notifiable_nolock_(struct event_base *base)
int int
event_base_foreach_event_(struct event_base *base, 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; int r, i;
unsigned u; 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; /* Helper for event_base_dump_events: called on each event in the event base;
* dumps only the inserted events. */ * dumps only the inserted events. */
static int 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; FILE *output = arg;
const char *gloss = (e->ev_events & EV_SIGNAL) ? 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; /* Helper for event_base_dump_events: called on each event in the event base;
* dumps only the active events. */ * dumps only the active events. */
static int 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; FILE *output = arg;
const char *gloss = (e->ev_events & EV_SIGNAL) ? 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; 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 void
event_base_dump_events(struct event_base *base, FILE *output) event_base_dump_events(struct event_base *base, FILE *output)
{ {
EVBASE_ACQUIRE_LOCK(base, th_base_lock);
fprintf(output, "Inserted events:\n"); fprintf(output, "Inserted events:\n");
event_base_foreach_event_(base, dump_inserted_event_fn, output); event_base_foreach_event_(base, dump_inserted_event_fn, output);
fprintf(output, "Active events:\n"); fprintf(output, "Active events:\n");
event_base_foreach_event_(base, dump_active_event_fn, output); event_base_foreach_event_(base, dump_active_event_fn, output);
EVBASE_RELEASE_LOCK(base, th_base_lock);
} }
void void

View File

@ -963,7 +963,7 @@ evmap_check_integrity_(struct event_base *base)
/* Helper type for evmap_foreach_event_: Bundles a function to call on every /* 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. */ * event, and the user-provided void* to use as its third argument. */
struct evmap_foreach_event_helper { 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; void *arg;
}; };
@ -1001,7 +1001,7 @@ evmap_signal_foreach_event_fn(struct event_base *base, int signum,
int int
evmap_foreach_event_(struct event_base *base, 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; struct evmap_foreach_event_helper h;
int r; int r;

View File

@ -1325,6 +1325,27 @@ void event_set_mem_functions(
*/ */
void event_base_dump_events(struct event_base *, FILE *); 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()), /** Sets 'tv' to the current time (as returned by gettimeofday()),
looking at the cached value in 'base' if possible, and calling looking at the cached value in 'base' if possible, and calling
gettimeofday() or clock_gettime() as appropriate if there is no gettimeofday() or clock_gettime() as appropriate if there is no