]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
CLEANUP: poll: move the conditions for waiting out of the poll functions
authorWilly Tarreau <w@1wt.eu>
Mon, 13 Apr 2015 18:44:19 +0000 (20:44 +0200)
committerWilly Tarreau <w@1wt.eu>
Mon, 13 Apr 2015 18:47:51 +0000 (20:47 +0200)
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.

src/ev_epoll.c
src/ev_kqueue.c
src/ev_poll.c
src/ev_select.c
src/haproxy.c

index c52d07521adb10b8e860aa446993c897218448fe..ccb7c33772ab62f5aad297437e6795ea1f6d80a6 100644 (file)
@@ -25,9 +25,6 @@
 #include <types/global.h>
 
 #include <proto/fd.h>
-#include <proto/signal.h>
-#include <proto/task.h>
-
 
 
 /* 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 */
index 2af94b647c10a44541c128ea6d42a88c77ac17a9..007336fa7c19a9699969a4e438984b4a62570b8b 100644 (file)
@@ -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 @@ 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);
index 866906c3a3515a14bcd9c2090e247d7e33099b1b..44a2b9b64146f7244968e0fff2cd23ef7b4acc57 100644 (file)
@@ -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 @@ 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;
index 73fe327aa838413632d08de5f1546ff8d1659549..35d3c77db7a604a95d8e8246faf99e34833e5637 100644 (file)
@@ -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 @@ 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 */
index b2f3e367aa9fd8cbcee0a22037f4c741199ef08a..752c4a2d02677042aa1826997dcd43978d25423c 100644 (file)
@@ -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 <next> */
                cur_poller.poll(&cur_poller, next);
                fd_process_cached_events();