-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Hi,

When ev_signal is used, the assertion on line 220 fails on
event_base_free(). This is because the signal stuff is not dealloced.
Two solutions: remove that assertion (since the event that is not
removed is static in signal.c, there is no memory leak here) or use the
patch I have attached. The patch I attached also closes the pipe that
evsignal_init opened.

Hmm, ev_signal does not look at which event_base is used. Is that
threadsafe?

Best regards,
  Wouter

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (GNU/Linux)
Comment: Using GnuPG with Fedora - http://enigmail.mozdev.org

iD8DBQFFx2NJkDLqNwOhpPgRAqM/AJ4hUuJAkaR5lcSXrl5jXRUQ12y0uQCfXpX3
f11V0I0NasvuBD4ti0x+DiI=
=wofl
-----END PGP SIGNATURE-----
Index: poll.c
===================================================================
--- poll.c      (revision 319)
+++ poll.c      (working copy)
@@ -383,6 +383,7 @@
 {
        struct pollop *pop = arg;
 
+       evsignal_dealloc();
        if (pop->event_set)
                free(pop->event_set);
        if (pop->event_r_back)
Index: select.c
===================================================================
--- select.c    (revision 319)
+++ select.c    (working copy)
@@ -358,6 +358,7 @@
 {
        struct selectop *sop = arg;
 
+       evsignal_dealloc();
        if (sop->event_readset_in)
                free(sop->event_readset_in);
        if (sop->event_writeset_in)
Index: devpoll.c
===================================================================
--- devpoll.c   (revision 319)
+++ devpoll.c   (working copy)
@@ -409,6 +409,7 @@
 {
        struct devpollop *devpollop = arg;
 
+       evsignal_dealloc();
        if (devpollop->fds)
                free(devpollop->fds);
        if (devpollop->events)
Index: epoll.c
===================================================================
--- epoll.c     (revision 319)
+++ epoll.c     (working copy)
@@ -357,6 +357,7 @@
 {
        struct epollop *epollop = arg;
 
+       evsignal_dealloc();
        if (epollop->fds)
                free(epollop->fds);
        if (epollop->events)
Index: evsignal.h
===================================================================
--- evsignal.h  (revision 319)
+++ evsignal.h  (working copy)
@@ -33,5 +33,6 @@
 int evsignal_deliver(sigset_t *);
 int evsignal_add(sigset_t *, struct event *);
 int evsignal_del(sigset_t *, struct event *);
+void evsignal_dealloc(void);
 
 #endif /* _EVSIGNAL_H_ */
Index: signal.c
===================================================================
--- signal.c    (revision 319)
+++ signal.c    (working copy)
@@ -47,6 +47,7 @@
 #ifdef HAVE_FCNTL_H
 #include <fcntl.h>
 #endif
+#include <assert.h>
 
 #include "event.h"
 #include "evsignal.h"
@@ -121,10 +122,6 @@
        return (0);
 }
 
-/*
- * Nothing to be done here.
- */
-
 int
 evsignal_del(sigset_t *evsigmask, struct event *ev)
 {
@@ -210,3 +207,14 @@
        evsignal_caught = 0;
 }
 
+void
+evsignal_dealloc(void)
+{
+       if(ev_signal_added) {
+               event_del(&ev_signal);
+               ev_signal_added = 0;
+       }
+       assert(TAILQ_EMPTY(&signalqueue));
+       close(ev_signal_pair[0]);
+       close(ev_signal_pair[1]);
+}
Index: event.c
===================================================================
--- event.c     (revision 319)
+++ event.c     (working copy)
@@ -217,7 +217,6 @@
                current_base = NULL;
 
        assert(base);
-       assert(TAILQ_EMPTY(&base->eventqueue));
        for (i=0; i < base->nactivequeues; ++i)
                assert(TAILQ_EMPTY(base->activequeues[i]));
 
@@ -229,6 +228,7 @@
 
        if (base->evsel->dealloc != NULL)
                base->evsel->dealloc(base->evbase);
+       assert(TAILQ_EMPTY(&base->eventqueue));
 
        free(base);
 }
_______________________________________________
Libevent-users mailing list
Libevent-users@monkey.org
http://monkey.org/mailman/listinfo/libevent-users

Reply via email to