mirror of
https://github.com/cuberite/libevent.git
synced 2025-09-13 14:26:30 -04:00
Use pipes for telling signals to main thread when possible
This commit is contained in:
parent
ca76cd931f
commit
a35f396f28
22
signal.c
22
signal.c
@ -122,7 +122,7 @@ evsig_set_base(struct event_base *base)
|
|||||||
EVSIGBASE_LOCK();
|
EVSIGBASE_LOCK();
|
||||||
evsig_base = base;
|
evsig_base = base;
|
||||||
evsig_base_n_signals_added = base->sig.ev_n_signals_added;
|
evsig_base_n_signals_added = base->sig.ev_n_signals_added;
|
||||||
evsig_base_fd = base->sig.ev_signal_pair[0];
|
evsig_base_fd = base->sig.ev_signal_pair[1];
|
||||||
EVSIGBASE_UNLOCK();
|
EVSIGBASE_UNLOCK();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -141,7 +141,11 @@ evsig_cb(evutil_socket_t fd, short what, void *arg)
|
|||||||
memset(&ncaught, 0, sizeof(ncaught));
|
memset(&ncaught, 0, sizeof(ncaught));
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
|
#ifdef _WIN32
|
||||||
n = recv(fd, signals, sizeof(signals), 0);
|
n = recv(fd, signals, sizeof(signals), 0);
|
||||||
|
#else
|
||||||
|
n = read(fd, signals, sizeof(signals));
|
||||||
|
#endif
|
||||||
if (n == -1) {
|
if (n == -1) {
|
||||||
int err = evutil_socket_geterror(fd);
|
int err = evutil_socket_geterror(fd);
|
||||||
if (! EVUTIL_ERR_RW_RETRIABLE(err))
|
if (! EVUTIL_ERR_RW_RETRIABLE(err))
|
||||||
@ -174,8 +178,7 @@ evsig_init(struct event_base *base)
|
|||||||
* pair to wake up our event loop. The event loop then scans for
|
* pair to wake up our event loop. The event loop then scans for
|
||||||
* signals that got delivered.
|
* signals that got delivered.
|
||||||
*/
|
*/
|
||||||
if (evutil_socketpair(
|
if (evutil_make_internal_pipe(base->sig.ev_signal_pair) == -1) {
|
||||||
AF_UNIX, SOCK_STREAM, 0, base->sig.ev_signal_pair) == -1) {
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
/* Make this nonfatal on win32, where sometimes people
|
/* Make this nonfatal on win32, where sometimes people
|
||||||
have localhost firewalled. */
|
have localhost firewalled. */
|
||||||
@ -186,18 +189,13 @@ evsig_init(struct event_base *base)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
evutil_make_socket_closeonexec(base->sig.ev_signal_pair[0]);
|
|
||||||
evutil_make_socket_closeonexec(base->sig.ev_signal_pair[1]);
|
|
||||||
if (base->sig.sh_old) {
|
if (base->sig.sh_old) {
|
||||||
mm_free(base->sig.sh_old);
|
mm_free(base->sig.sh_old);
|
||||||
}
|
}
|
||||||
base->sig.sh_old = NULL;
|
base->sig.sh_old = NULL;
|
||||||
base->sig.sh_old_max = 0;
|
base->sig.sh_old_max = 0;
|
||||||
|
|
||||||
evutil_make_socket_nonblocking(base->sig.ev_signal_pair[0]);
|
event_assign(&base->sig.ev_signal, base, 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);
|
EV_READ | EV_PERSIST, evsig_cb, base);
|
||||||
|
|
||||||
base->sig.ev_signal.ev_flags |= EVLIST_INTERNAL;
|
base->sig.ev_signal.ev_flags |= EVLIST_INTERNAL;
|
||||||
@ -297,7 +295,7 @@ evsig_add(struct event_base *base, evutil_socket_t evsignal, short old, short ev
|
|||||||
}
|
}
|
||||||
evsig_base = base;
|
evsig_base = base;
|
||||||
evsig_base_n_signals_added = ++sig->ev_n_signals_added;
|
evsig_base_n_signals_added = ++sig->ev_n_signals_added;
|
||||||
evsig_base_fd = base->sig.ev_signal_pair[0];
|
evsig_base_fd = base->sig.ev_signal_pair[1];
|
||||||
EVSIGBASE_UNLOCK();
|
EVSIGBASE_UNLOCK();
|
||||||
|
|
||||||
event_debug(("%s: %d: changing signal handler", __func__, (int)evsignal));
|
event_debug(("%s: %d: changing signal handler", __func__, (int)evsignal));
|
||||||
@ -396,7 +394,11 @@ evsig_handler(int sig)
|
|||||||
|
|
||||||
/* Wake up our notification mechanism */
|
/* Wake up our notification mechanism */
|
||||||
msg = sig;
|
msg = sig;
|
||||||
|
#ifdef _WIN32
|
||||||
send(evsig_base_fd, (char*)&msg, 1, 0);
|
send(evsig_base_fd, (char*)&msg, 1, 0);
|
||||||
|
#else
|
||||||
|
write(evsig_base_fd, (char*)&msg, 1);
|
||||||
|
#endif
|
||||||
errno = save_errno;
|
errno = save_errno;
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
EVUTIL_SET_SOCKET_ERROR(socket_errno);
|
EVUTIL_SET_SOCKET_ERROR(socket_errno);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user