diff options
Diffstat (limited to 'source4/lib/events/events_standard.c')
-rw-r--r-- | source4/lib/events/events_standard.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/source4/lib/events/events_standard.c b/source4/lib/events/events_standard.c index b0f5259fa7..9c470235d0 100644 --- a/source4/lib/events/events_standard.c +++ b/source4/lib/events/events_standard.c @@ -229,8 +229,19 @@ static int epoll_event_loop(struct std_event_context *std_ev, struct timeval *tv timeout = ((tvalp->tv_usec+999) / 1000) + (tvalp->tv_sec*1000); } + if (epoll_ev->ev->num_signal_handlers && + common_event_check_signal(epoll_ev->ev)) { + return 0; + } + ret = epoll_wait(std_ev->epoll_fd, events, MAXEVENTS, timeout); + if (ret == -1 && errno == EINTR && epoll_ev->ev->num_signal_handlers) { + if (common_event_check_signal(epoll_ev->ev)) { + return 0; + } + } + if (ret == -1 && errno != EINTR) { epoll_fallback_to_select(std_ev, "epoll_wait() failed"); return -1; @@ -434,8 +445,19 @@ static int std_event_loop_select(struct std_event_context *std_ev, struct timeva } } + if (std_ev->ev->num_signal_handlers && + common_event_check_signal(std_ev->ev)) { + return 0; + } + selrtn = select(std_ev->maxfd+1, &r_fds, &w_fds, NULL, tvalp); + if (selrtn == -1 && errno == EINTR && + std_ev->ev->num_signal_handlers) { + common_event_check_signal(std_ev->ev); + return 0; + } + if (selrtn == -1 && errno == EBADF) { /* the socket is dead! this should never happen as the socket should have first been @@ -520,6 +542,7 @@ static const struct event_ops std_event_ops = { .get_fd_flags = std_event_get_fd_flags, .set_fd_flags = std_event_set_fd_flags, .add_timed = common_event_add_timed, + .add_signal = common_event_add_signal, .loop_once = std_event_loop_once, .loop_wait = std_event_loop_wait, }; |