From: Nick Mathewson Date: Thu, 19 Aug 2010 18:00:06 +0000 (-0400) Subject: Avoid deadlock when activating signals. X-Git-Tag: release-2.0.7-rc~29 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=970e6ad2ba4e42963d51c032ae8f9d2bdf2cefda;p=libevent Avoid deadlock when activating signals. Fixes bug 3048812. Based on patch by Nicholas Marriott. --- diff --git a/signal.c b/signal.c index 3c474d33..1954223d 100644 --- a/signal.c +++ b/signal.c @@ -89,8 +89,11 @@ evsig_cb(evutil_socket_t fd, short what, void *arg) (void)arg; /* Suppress "unused variable" warning. */ n = recv(fd, signals, sizeof(signals), 0); - if (n == -1) - event_sock_err(1, fd, "%s: read", __func__); + if (n == -1) { + int err = evutil_socket_geterror(fd); + if (! EVUTIL_ERR_RW_RETRIABLE(err)) + event_sock_err(1, fd, "%s: recv", __func__); + } } int @@ -121,6 +124,7 @@ evsig_init(struct event_base *base) memset(&base->sig.evsigcaught, 0, sizeof(sig_atomic_t)*NSIG); evutil_make_socket_nonblocking(base->sig.ev_signal_pair[0]); + evutil_make_socket_nonblocking(base->sig.ev_signal_pair[1]); event_assign(&base->sig.ev_signal, base, base->sig.ev_signal_pair[1], EV_READ | EV_PERSIST, evsig_cb, &base->sig.ev_signal);