diff --git a/src/ev_epoll.c b/src/ev_epoll.c index c52d07521..ccb7c3377 100644 --- a/src/ev_epoll.c +++ b/src/ev_epoll.c @@ -25,9 +25,6 @@ #include #include -#include -#include - /* private data */ @@ -112,25 +109,14 @@ REGPRM2 static void _do_poll(struct poller *p, int exp) fd_nbupdt = 0; /* compute the epoll_wait() timeout */ - - if (fd_cache_num || run_queue || signal_queue_len) { - /* Maybe we still have events in the spec list, or there are - * some tasks left pending in the run_queue, so we must not - * wait in epoll() otherwise we would delay their delivery by - * the next timeout. - */ + if (!exp) + wait_time = MAX_DELAY_MS; + else if (tick_is_expired(exp, now_ms)) wait_time = 0; - } else { - if (!exp) + wait_time = TICKS_TO_MS(tick_remain(now_ms, exp)) + 1; + if (wait_time > MAX_DELAY_MS) wait_time = MAX_DELAY_MS; - else if (tick_is_expired(exp, now_ms)) - wait_time = 0; - else { - wait_time = TICKS_TO_MS(tick_remain(now_ms, exp)) + 1; - if (wait_time > MAX_DELAY_MS) - wait_time = MAX_DELAY_MS; - } } /* now let's wait for polled events */ diff --git a/src/ev_kqueue.c b/src/ev_kqueue.c index 2af94b647..007336fa7 100644 --- a/src/ev_kqueue.c +++ b/src/ev_kqueue.c @@ -26,8 +26,7 @@ #include #include -#include -#include + /* private data */ static int kqueue_fd; @@ -93,19 +92,17 @@ REGPRM2 static void _do_poll(struct poller *p, int exp) timeout.tv_sec = 0; timeout.tv_nsec = 0; - if (!fd_cache_num && !run_queue && !signal_queue_len) { - if (!exp) { - delta_ms = MAX_DELAY_MS; - timeout.tv_sec = (MAX_DELAY_MS / 1000); - timeout.tv_nsec = (MAX_DELAY_MS % 1000) * 1000000; - } - else if (!tick_is_expired(exp, now_ms)) { - delta_ms = TICKS_TO_MS(tick_remain(now_ms, exp)) + 1; - if (delta_ms > MAX_DELAY_MS) - delta_ms = MAX_DELAY_MS; - timeout.tv_sec = (delta_ms / 1000); - timeout.tv_nsec = (delta_ms % 1000) * 1000000; - } + if (!exp) { + delta_ms = MAX_DELAY_MS; + timeout.tv_sec = (MAX_DELAY_MS / 1000); + timeout.tv_nsec = (MAX_DELAY_MS % 1000) * 1000000; + } + else if (!tick_is_expired(exp, now_ms)) { + delta_ms = TICKS_TO_MS(tick_remain(now_ms, exp)) + 1; + if (delta_ms > MAX_DELAY_MS) + delta_ms = MAX_DELAY_MS; + timeout.tv_sec = (delta_ms / 1000); + timeout.tv_nsec = (delta_ms % 1000) * 1000000; } fd = MIN(maxfd, global.tune.maxpollevents); diff --git a/src/ev_poll.c b/src/ev_poll.c index 866906c3a..44a2b9b64 100644 --- a/src/ev_poll.c +++ b/src/ev_poll.c @@ -23,8 +23,6 @@ #include #include -#include -#include static unsigned int *fd_evts[2]; @@ -116,9 +114,7 @@ REGPRM2 static void _do_poll(struct poller *p, int exp) } /* now let's wait for events */ - if (fd_cache_num || run_queue || signal_queue_len) - wait_time = 0; - else if (!exp) + if (!exp) wait_time = MAX_DELAY_MS; else if (tick_is_expired(exp, now_ms)) wait_time = 0; diff --git a/src/ev_select.c b/src/ev_select.c index 73fe327aa..35d3c77db 100644 --- a/src/ev_select.c +++ b/src/ev_select.c @@ -22,8 +22,6 @@ #include #include -#include -#include static fd_set *fd_evts[2]; @@ -83,19 +81,17 @@ REGPRM2 static void _do_poll(struct poller *p, int exp) delta.tv_sec = 0; delta.tv_usec = 0; - if (!fd_cache_num && !run_queue && !signal_queue_len) { - if (!exp) { - delta_ms = MAX_DELAY_MS; - delta.tv_sec = (MAX_DELAY_MS / 1000); - delta.tv_usec = (MAX_DELAY_MS % 1000) * 1000; - } - else if (!tick_is_expired(exp, now_ms)) { - delta_ms = TICKS_TO_MS(tick_remain(now_ms, exp)) + SCHEDULER_RESOLUTION; - if (delta_ms > MAX_DELAY_MS) - delta_ms = MAX_DELAY_MS; - delta.tv_sec = (delta_ms / 1000); - delta.tv_usec = (delta_ms % 1000) * 1000; - } + if (!exp) { + delta_ms = MAX_DELAY_MS; + delta.tv_sec = (MAX_DELAY_MS / 1000); + delta.tv_usec = (MAX_DELAY_MS % 1000) * 1000; + } + else if (!tick_is_expired(exp, now_ms)) { + delta_ms = TICKS_TO_MS(tick_remain(now_ms, exp)) + SCHEDULER_RESOLUTION; + if (delta_ms > MAX_DELAY_MS) + delta_ms = MAX_DELAY_MS; + delta.tv_sec = (delta_ms / 1000); + delta.tv_usec = (delta_ms % 1000) * 1000; } /* let's restore fdset state */ diff --git a/src/haproxy.c b/src/haproxy.c index b2f3e367a..752c4a2d0 100644 --- a/src/haproxy.c +++ b/src/haproxy.c @@ -1486,6 +1486,10 @@ void run_poll_loop() if (jobs == 0) break; + /* expire immediately if events are pending */ + if (fd_cache_num || run_queue || signal_queue_len) + next = now_ms; + /* The poller will ensure it returns around */ cur_poller.poll(&cur_poller, next); fd_process_cached_events();