From bdefc513a04c2189745933bc73815f81fc637233 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Mon, 14 May 2007 02:02:04 +0200 Subject: [PATCH] [BUG] fix null timeouts in *poll-based pollers 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 | 8 +++++--- src/ev_poll.c | 8 +++++--- src/ev_sepoll.c | 8 +++++--- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/ev_epoll.c b/src/ev_epoll.c index a867e8dc36..d313d56906 100644 --- a/src/ev_epoll.c +++ b/src/ev_epoll.c @@ -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); diff --git a/src/ev_poll.c b/src/ev_poll.c index 3c97707cc8..0166bd6aef 100644 --- a/src/ev_poll.c +++ b/src/ev_poll.c @@ -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); diff --git a/src/ev_sepoll.c b/src/ev_sepoll.c index 516c0f592a..3e25866f8e 100644 --- a/src/ev_sepoll.c +++ b/src/ev_sepoll.c @@ -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 */ -- 2.47.3