Permalink
Browse files

Avoid deadlock when activating signals.

Fixes bug 3048812.

Based on patch by Nicholas Marriott.
  • Loading branch information...
1 parent 6123d12 commit 970e6ad2ba4e42963d51c032ae8f9d2bdf2cefda Nick Mathewson committed Aug 19, 2010
Showing with 6 additions and 2 deletions.
  1. +6 −2 signal.c
View
@@ -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);

0 comments on commit 970e6ad

Please sign in to comment.