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. */
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'.

21
event.c
View File

@ -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

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
* 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;

View File

@ -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