CLEANUP: poll: move the conditions for waiting out of the poll functions
The poll() functions have become a bit dirty because they now check the
size of the signal queue, the FD cache and the number of tasks. It's not
their job, this must be moved to the caller. In the end it simplifies the
code because the expiration date is now set to now_ms if we must not wait,
and this achieves in exactly the same result and is cleaner. The change
looks large due to the change of indent for blocks which were inside an
"if" block.
diff --git a/src/ev_epoll.c b/src/ev_epoll.c
index c52d075..ccb7c33 100644
--- a/src/ev_epoll.c
+++ b/src/ev_epoll.c
@@ -25,11 +25,8 @@
#include <types/global.h>
#include <proto/fd.h>
-#include <proto/signal.h>
-#include <proto/task.h>
-
/* private data */
static struct epoll_event *epoll_events;
static int epoll_fd;
@@ -112,25 +109,14 @@
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 2af94b6..007336f 100644
--- a/src/ev_kqueue.c
+++ b/src/ev_kqueue.c
@@ -26,8 +26,7 @@
#include <types/global.h>
#include <proto/fd.h>
-#include <proto/signal.h>
-#include <proto/task.h>
+
/* private data */
static int kqueue_fd;
@@ -93,19 +92,17 @@
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 866906c..44a2b9b 100644
--- a/src/ev_poll.c
+++ b/src/ev_poll.c
@@ -23,8 +23,6 @@
#include <types/global.h>
#include <proto/fd.h>
-#include <proto/signal.h>
-#include <proto/task.h>
static unsigned int *fd_evts[2];
@@ -116,9 +114,7 @@
}
/* 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 73fe327..35d3c77 100644
--- a/src/ev_select.c
+++ b/src/ev_select.c
@@ -22,8 +22,6 @@
#include <types/global.h>
#include <proto/fd.h>
-#include <proto/signal.h>
-#include <proto/task.h>
static fd_set *fd_evts[2];
@@ -83,19 +81,17 @@
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 b2f3e36..752c4a2 100644
--- a/src/haproxy.c
+++ b/src/haproxy.c
@@ -1486,6 +1486,10 @@
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 <next> */
cur_poller.poll(&cur_poller, next);
fd_process_cached_events();