event_reinit: always re-init signal's socketpair

Before this patch event_reinit() only closes the signal socketpair fds and
recreates them if signals have been added, but this is wrong, since socketpair
fds created on backend init, and if we will not re-create them bad things in
child/parent signal handling will happens (and indeed this is what happens for
non-reinit backends like select).

Fixes: #307
This commit is contained in:
Nicholas Marriott 2015-12-27 01:43:37 +03:00 committed by Azat Khuzhin
parent b8ec70c461
commit ad0c237bc0

11
event.c
View File

@ -969,13 +969,13 @@ event_reinit(struct event_base *base)
event_del_nolock_(&base->sig.ev_signal, EVENT_DEL_AUTOBLOCK); event_del_nolock_(&base->sig.ev_signal, EVENT_DEL_AUTOBLOCK);
event_debug_unassign(&base->sig.ev_signal); event_debug_unassign(&base->sig.ev_signal);
memset(&base->sig.ev_signal, 0, sizeof(base->sig.ev_signal)); memset(&base->sig.ev_signal, 0, sizeof(base->sig.ev_signal));
if (base->sig.ev_signal_pair[0] != -1)
EVUTIL_CLOSESOCKET(base->sig.ev_signal_pair[0]);
if (base->sig.ev_signal_pair[1] != -1)
EVUTIL_CLOSESOCKET(base->sig.ev_signal_pair[1]);
had_signal_added = 1; had_signal_added = 1;
base->sig.ev_signal_added = 0; base->sig.ev_signal_added = 0;
} }
if (base->sig.ev_signal_pair[0] != -1)
EVUTIL_CLOSESOCKET(base->sig.ev_signal_pair[0]);
if (base->sig.ev_signal_pair[1] != -1)
EVUTIL_CLOSESOCKET(base->sig.ev_signal_pair[1]);
if (base->th_notify_fn != NULL) { if (base->th_notify_fn != NULL) {
was_notifiable = 1; was_notifiable = 1;
base->th_notify_fn = NULL; base->th_notify_fn = NULL;
@ -1024,8 +1024,7 @@ event_reinit(struct event_base *base)
if (evmap_reinit_(base) < 0) if (evmap_reinit_(base) < 0)
res = -1; res = -1;
} else { } else {
if (had_signal_added) res = evsig_init_(base);
res = evsig_init_(base);
} }
/* If we were notifiable before, and nothing just exploded, become /* If we were notifiable before, and nothing just exploded, become