From: Nick M. <ni...@us...> - 2010-08-19 18:04:22
|
Author: Nick Mathewson <ni...@to...> Date: Thu, 19 Aug 2010 14:00:06 -0400 Subject: Avoid deadlock when activating signals. Commit: 970e6ad2ba4e42963d51c032ae8f9d2bdf2cefda Fixes bug 3048812. Based on patch by Nicholas Marriott. --- signal.c | 8 ++++++-- 1 files changed, 6 insertions(+), 2 deletions(-) diff --git a/signal.c b/signal.c index 3c474d3..1954223 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); -- 1.6.3 |