[Libevent-users] patch to dealloc evsignal

Wouter Wijngaards wouter at NLnetLabs.nl
Mon Feb 5 12:03:06 EST 2007


-----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-----
-------------- next part --------------
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);
 }


More information about the Libevent-users mailing list