[Libevent-users] Bug in signal.c
Jesse Keller
jkeller at 454.com
Tue May 29 07:50:20 EDT 2007
Scott -
Quoth Homer: *DOH*. Very true, I only ever had one signal handler. I
changed my signal.c to do reference counting so that I can live with
myself. Since Wouter fixed it already, though, I'll grab the trunk from
subversion and play with that, too.
Thanks!
-Jesse
On Tue, 2007-05-29 at 09:44 +0200, Wouter Wijngaards wrote:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
>
> Hi,
>
> Not sure if 1.3b has my signal patch in it; but I believe I paid
> attention so that all the internal signal events are deleted properly
> (on event-base-free). Could be my mistake still, but are you sure that
> the bug still exists in libevent-trunk?
>
> The reason I think its different, is that with my patch (which is in
> trunk for sure), multiple event bases will use multiple internal events
> for signal handling where libevent-1.1 would use only one internal event
> ever. And the bases would clean up their events on free (at least - that
> is the theory of operation :-) ).
>
> Best regards,
> Wouter
>
> Scott Lamb wrote:
> >
> > On May 28, 2007, at 8:28 AM, Jesse Keller wrote:
> >
> >> Just implemented libevent in a new program using the cool eventxx C++
> >> wrapper. Anyway, I decided to track down the event_base_free bug a
> >> little more. Here's the original bug and patch.
> >>
> >> http://monkeymail.org/archives/libevent-users/2006-April/000141.html
> >>
> >> Seems that we don't need to go through all that effort of fixing the
> >> symptom, it's just that the internal event between the signal handler
> >> and the dispatcher is never deleted.
> >>
> >> Here's the patch that fixes the problem for me (versus the 1.3b release)
> >>
> >>
> >> --- signal.c 2007-03-03 23:05:07.000000000 -0500
> >> +++ signal.c.new 2007-05-28 11:10:57.000000000 -0400
> >> @@ -143,6 +143,11 @@
> >> int evsignal;
> >>
> >> evsignal = EVENT_SIGNAL(ev);
> >> +
> >> + if (ev_signal_added) {
> >> + ev_signal_added = 0;
> >> + event_del(&ev_signal);
> >> + }
> >>
> >> return (sigaction(EVENT_SIGNAL(ev),(struct sigaction *)SIG_DFL,
> >> NULL));
> >> }
> >
> > But ev_signal is for the pipe used to wake up on receipt of *any*
> > signal. Consider this code snippet:
> >
> > signal_set(&ev1, SIGUSR1, signal_cb, NULL);
> > event_add(&ev1, NULL);
> > signal_set(&ev2, SIGUSR2, signal_cb, NULL);
> > event_add(&ev2, NULL);
> > event_del(&ev2);
> >
> > raise(SIGUSR1);
> > event_dispatch(EVLOOP_ONCE);
> >
> > without your change, the dispatch would return immediately. With your
> > change, it would wait until timeout.
> >
> > --Scott Lamb <http://www.slamb.org/>
> > _______________________________________________
> > Libevent-users mailing list
> > Libevent-users at monkey.org
> > http://monkey.org/mailman/listinfo/libevent-users
>
> -----BEGIN PGP SIGNATURE-----
> Version: GnuPG v1.4.7 (GNU/Linux)
> Comment: Using GnuPG with Fedora - http://enigmail.mozdev.org
>
> iD8DBQFGW9nikDLqNwOhpPgRAkVuAJ93LjcTFeIuEw5jecLf/05LRl0F8QCeIVe2
> 9DRVVVs8aDY3DzjTBwLepXo=
> =Gllv
> -----END PGP SIGNATURE-----
More information about the Libevent-users
mailing list