]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
[BUG] fix null timeouts in *poll-based pollers
authorWilly Tarreau <w@1wt.eu>
Mon, 14 May 2007 00:02:04 +0000 (02:02 +0200)
committerWilly Tarreau <w@1wt.eu>
Mon, 14 May 2007 00:02:04 +0000 (02:02 +0200)
Introduction of timeval timers broke *poll-based pollers, because the call to
tv_ms_remain may return 0 while the event is not elapsed yet. Now we carefully
check for those cases and round the result up by 1 ms.

src/ev_epoll.c
src/ev_poll.c
src/ev_sepoll.c

index a867e8dc369605bc8b3013b6bdbb3a140b0a681d..d313d5690697d1c2396b7613db8e3db81e0a7418 100644 (file)
@@ -231,10 +231,12 @@ REGPRM2 static void _do_poll(struct poller *p, struct timeval *exp)
                fd_flush_changes();
 
        /* now let's wait for events */
-       if (tv_isset(exp))
-               wait_time = tv_ms_remain(&now, exp);
-       else
+       if (tv_iseternity(exp))
                wait_time = -1;
+       else if (tv_isge(&now, exp))
+               wait_time = 0;
+       else
+               wait_time = __tv_ms_elapsed(&now, exp) + 1;
 
        status = epoll_wait(epoll_fd, epoll_events, maxfd, wait_time);
        tv_now(&now);
index 3c97707cc88fb55bcfb19f7159624b65d438aecf..0166bd6aef4f92616b5ee19e2ab2fdfd4594170b 100644 (file)
@@ -124,10 +124,12 @@ REGPRM2 static void _do_poll(struct poller *p, struct timeval *exp)
        }
       
        /* now let's wait for events */
-       if (tv_isset(exp))
-               wait_time = tv_ms_remain(&now, exp);
-       else
+       if (tv_iseternity(exp))
                wait_time = -1;
+       else if (tv_isge(&now, exp))
+               wait_time = 0;
+       else
+               wait_time = __tv_ms_elapsed(&now, exp) + 1;
 
        status = poll(poll_events, nbfd, wait_time);
        tv_now(&now);
index 516c0f592ada1fcc36d869d9ab7326aa87a663a4..3e25866f8e246e81af43e23eabbf4a571a11bd12 100644 (file)
@@ -380,10 +380,12 @@ REGPRM2 static void _do_poll(struct poller *p, struct timeval *exp)
                wait_time = 0;
        }
        else {
-               if (tv_isset(exp))
-                       wait_time = tv_ms_remain(&now, exp);
-               else
+               if (tv_iseternity(exp))
                        wait_time = -1;
+               else if (tv_isge(&now, exp))
+                       wait_time = 0;
+               else
+                       wait_time = __tv_ms_elapsed(&now, exp) + 1;
        }
 
        /* now let's wait for real events */