]> granicus.if.org Git - libevent/commitdiff
Expose event_base_foreach_event() as a public API.
authorRoman Puls <puls@x-fabric.com>
Fri, 7 Sep 2012 13:47:50 +0000 (09:47 -0400)
committerNick Mathewson <nickm@torproject.org>
Fri, 7 Sep 2012 13:47:50 +0000 (09:47 -0400)
event-internal.h
event.c
evmap.c
include/event2/event.h

index 112821dad6c8ae06bb95d10063bc51a09e5da4f1..5372af887dc29bc4acac9ec6bd7afd404f37737f 100644 (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'.
diff --git a/event.c b/event.c
index 79664d4867495f44b69f629d0faf6132eec93ed5..2e1676ce210dcd57bb55712dea3e4bb491aace9b 100644 (file)
--- 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 62ecb7b34873fd398f5bb546b465ce4c4a43905a..e02e4e91f0f06a4301298756b0244ec78139046a 100644 (file)
--- 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;
index c2f65c921223bff86e4fee39523104bcacdfa2fe..503b9de189f23232682d67169aa795c64d236146 100644 (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