summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--event-internal.h2
-rw-r--r--event.c21
-rw-r--r--evmap.c4
-rw-r--r--include/event2/event.h21
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