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.
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);
}
/* 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);
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 */