diff --git a/src/iomux_epoll.c b/src/iomux_epoll.c index 229d445..c73dff8 100644 --- a/src/iomux_epoll.c +++ b/src/iomux_epoll.c @@ -157,8 +157,11 @@ static int iomux_epoll_run(struct IOMux *mux_, struct timeval *timeout) timeout_ms = timeval_to_ms(timeout); else timeout_ms = -1; - +again: rc = epoll_wait(mux->epoll_fd, mux->pending_events, EPOLL_WAIT_EVENTS, timeout_ms); + if(rc == -1 && errno == EINTR) + goto again; + assert(rc >= 0); if(rc < 0) return errno; diff --git a/src/iomux_select.c b/src/iomux_select.c index a69f721..e448d08 100644 --- a/src/iomux_select.c +++ b/src/iomux_select.c @@ -133,6 +133,8 @@ static int iomux_select_run(struct IOMux *mux_, struct timeval *timeout) int rc; size_t i; int event_cnt = 0; + fd_set read_set; + fd_set write_set; if(mux->deleted_cnt) { iomux_select_rebuild(mux); @@ -142,10 +144,13 @@ static int iomux_select_run(struct IOMux *mux_, struct timeval *timeout) if(mux->max_fd == -1 && timeout == NULL) return 0; - fd_set read_set = mux->master_read_set; - fd_set write_set = mux->master_write_set; - +again: + read_set = mux->master_read_set; + write_set = mux->master_write_set; rc = select(mux->max_fd + 1, &read_set, &write_set, NULL, timeout); //we can use timeout directly + if(rc == -1 && errno == EINTR) + goto again; + assert(rc >= 0); if(rc < 0) return -1;