mirror of
https://github.com/cuberite/libevent.git
synced 2025-09-10 13:04:23 -04:00
Avoid deadlock when activating signals.
Fixes bug 3048812. Based on patch by Nicholas Marriott.
This commit is contained in:
parent
6123d1298f
commit
970e6ad2ba
8
signal.c
8
signal.c
@ -89,8 +89,11 @@ evsig_cb(evutil_socket_t fd, short what, void *arg)
|
|||||||
(void)arg; /* Suppress "unused variable" warning. */
|
(void)arg; /* Suppress "unused variable" warning. */
|
||||||
|
|
||||||
n = recv(fd, signals, sizeof(signals), 0);
|
n = recv(fd, signals, sizeof(signals), 0);
|
||||||
if (n == -1)
|
if (n == -1) {
|
||||||
event_sock_err(1, fd, "%s: read", __func__);
|
int err = evutil_socket_geterror(fd);
|
||||||
|
if (! EVUTIL_ERR_RW_RETRIABLE(err))
|
||||||
|
event_sock_err(1, fd, "%s: recv", __func__);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
@ -121,6 +124,7 @@ evsig_init(struct event_base *base)
|
|||||||
memset(&base->sig.evsigcaught, 0, sizeof(sig_atomic_t)*NSIG);
|
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[0]);
|
||||||
|
evutil_make_socket_nonblocking(base->sig.ev_signal_pair[1]);
|
||||||
|
|
||||||
event_assign(&base->sig.ev_signal, base, 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);
|
EV_READ | EV_PERSIST, evsig_cb, &base->sig.ev_signal);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user