]> granicus.if.org Git - libevent/commitdiff
Merge remote-tracking branch 'origin/patches-2.0'
authorNick Mathewson <nickm@torproject.org>
Tue, 24 Jan 2012 15:29:31 +0000 (10:29 -0500)
committerNick Mathewson <nickm@torproject.org>
Tue, 24 Jan 2012 15:29:31 +0000 (10:29 -0500)
Conflicts:
event.c

Edits required in:
        evmap.c

1  2 
event-internal.h
event.c
evmap.c
test/regress.c
test/regress_main.c

Simple merge
diff --cc event.c
index 575f8f522fdf187970ccc42d1e55476fc70fe8d8,b2e9645110fc571fed5e7ec82fa0adf90cd66d42..79bf6f8a324606108da42380c43e53122ca442e3
+++ b/event.c
@@@ -861,9 -815,15 +861,13 @@@ event_reinit(struct event_base *base
        if (base->sig.ev_signal_added) {
                /* we cannot call event_del here because the base has
                 * not been reinitialized yet. */
 -              event_queue_remove(base, &base->sig.ev_signal,
 -                  EVLIST_INSERTED);
 +              event_queue_remove_inserted(base, &base->sig.ev_signal);
                if (base->sig.ev_signal.ev_flags & EVLIST_ACTIVE)
 -                      event_queue_remove(base, &base->sig.ev_signal,
 -                          EVLIST_ACTIVE);
 +                      event_queue_remove_active(base, &base->sig.ev_signal);
+               if (base->sig.ev_signal_pair[0] != -1)
+                       EVUTIL_CLOSESOCKET(base->sig.ev_signal_pair[0]);
+               if (base->sig.ev_signal_pair[1] != -1)
+                       EVUTIL_CLOSESOCKET(base->sig.ev_signal_pair[1]);
                base->sig.ev_signal_added = 0;
        }
        if (base->th_notify_fd[0] != -1) {
diff --cc evmap.c
index db98e0a124da1ee2af62c317f23b6180b41ad45f,829a73e2a4cff0d28c340b37870fef0f02baa007..b69c5d846bb4e44d6b17269466a47076c3e35200
+++ b/evmap.c
@@@ -721,3 -725,66 +721,66 @@@ event_changelist_del(struct event_base 
        return (0);
  }
  
 -              TAILQ_FOREACH(ev, &ctx->events, ev_io_next) {
+ void
+ evmap_check_integrity(struct event_base *base)
+ {
+ #define EVLIST_X_SIGFOUND 0x1000
+ #define EVLIST_X_IOFOUND 0x2000
+       int i;
+       struct event *ev;
+       struct event_io_map *io = &base->io;
+       struct event_signal_map *sigmap = &base->sigmap;
+       int nsignals, ntimers, nio;
+       nsignals = ntimers = nio = 0;
+       TAILQ_FOREACH(ev, &base->eventqueue, ev_next) {
+               EVUTIL_ASSERT(ev->ev_flags & EVLIST_INSERTED);
+               EVUTIL_ASSERT(ev->ev_flags & EVLIST_INIT);
+               ev->ev_flags &= ~(EVLIST_X_SIGFOUND|EVLIST_X_IOFOUND);
+       }
+       for (i = 0; i < io->nentries; ++i) {
+               struct evmap_io *ctx = io->entries[i];
+               if (!ctx)
+                       continue;
 -              TAILQ_FOREACH(ev, &ctx->events, ev_signal_next) {
++              LIST_FOREACH(ev, &ctx->events, ev_io_next) {
+                       EVUTIL_ASSERT(!(ev->ev_flags & EVLIST_X_IOFOUND));
+                       EVUTIL_ASSERT(ev->ev_fd == i);
+                       ev->ev_flags |= EVLIST_X_IOFOUND;
+                       nio++;
+               }
+       }
+       for (i = 0; i < sigmap->nentries; ++i) {
+               struct evmap_signal *ctx = sigmap->entries[i];
+               if (!ctx)
+                       continue;
++              LIST_FOREACH(ev, &ctx->events, ev_signal_next) {
+                       EVUTIL_ASSERT(!(ev->ev_flags & EVLIST_X_SIGFOUND));
+                       EVUTIL_ASSERT(ev->ev_fd == i);
+                       ev->ev_flags |= EVLIST_X_SIGFOUND;
+                       nsignals++;
+               }
+       }
+       TAILQ_FOREACH(ev, &base->eventqueue, ev_next) {
+               if (ev->ev_events & (EV_READ|EV_WRITE)) {
+                       EVUTIL_ASSERT(ev->ev_flags & EVLIST_X_IOFOUND);
+                       --nio;
+               }
+               if (ev->ev_events & EV_SIGNAL) {
+                       EVUTIL_ASSERT(ev->ev_flags & EVLIST_X_SIGFOUND);
+                       --nsignals;
+               }
+       }
+       EVUTIL_ASSERT(nio == 0);
+       EVUTIL_ASSERT(nsignals == 0);
+       /* There is no "EVUTIL_ASSERT(ntimers == 0)": eventqueue is only for
+        * pending signals and io events.
+        */
+ }
diff --cc test/regress.c
Simple merge
Simple merge