Hi, I have an application that repeatedly forks many short-lived child processes and waits for SIGCHLD notification. Frequently, the application ends up blocking in the read() call in evsignal_cb().
I think there's a condition where more than one signal is received and evsignal_handler() is called multiple times before evsignal_cb() gets called. When evsignal_cb() finally runs, it drains all the notifications from the socketpair, so the subsequent calls to evsignal_cb() block in read(). Attached is a patch that fixes the problem in my application, but I'm not a libevent expert so corrections would be welcome.
--- libevent-1.2a/signal.c.orig 2006-10-27 23:28:57.000000000 -0400 +++ libevent-1.2a/signal.c 2006-12-14 11:19:27.000000000 -0500 @@ -71,7 +71,7 @@ ssize_t n; n = read(fd, signals, sizeof(signals)); - if (n == -1) + if (n == -1 && errno != EAGAIN && errno != EWOULDBLOCK) event_err(1, "%s: read", __func__); event_add(ev, NULL); } @@ -102,6 +102,7 @@ FD_CLOSEONEXEC(ev_signal_pair[1]); fcntl(ev_signal_pair[0], F_SETFL, O_NONBLOCK); + fcntl(ev_signal_pair[1], F_SETFL, O_NONBLOCK); event_set(&ev_signal, ev_signal_pair[1], EV_READ, evsignal_cb, &ev_signal);
_______________________________________________ Libevent-users mailing list Libevent-users@monkey.org http://monkey.org/mailman/listinfo/libevent-users