(Merge 3.3) Issue #20311: select.epoll.poll() now rounds the timeout away from

zero, instead of rounding towards zero. For example, a timeout of one
microsecond is now rounded to one millisecond, instead of being rounded to
zero.
This commit is contained in:
Victor Stinner 2014-01-21 01:42:11 +01:00
commit 09354fd606
3 changed files with 18 additions and 1 deletions

View file

@ -47,6 +47,17 @@ class TestEPoll(unittest.TestCase):
self.serverSocket.listen(1) self.serverSocket.listen(1)
self.connections = [self.serverSocket] self.connections = [self.serverSocket]
def test_timeout_rounding(self):
# epoll_wait() has a resolution of 1 millisecond, check if the timeout
# is correctly rounded to the upper bound
epoll = select.epoll()
self.addCleanup(epoll.close)
for timeout in (1e-2, 1e-3, 1e-4):
t0 = time.perf_counter()
epoll.poll(timeout)
dt = time.perf_counter() - t0
self.assertGreaterEqual(dt, timeout)
def tearDown(self): def tearDown(self):
for skt in self.connections: for skt in self.connections:

View file

@ -25,6 +25,10 @@ Core and Builtins
Library Library
------- -------
- Issue #20311: select.epoll.poll() now rounds the timeout away from zero,
instead of rounding towards zero. For example, a timeout of one microsecond
is now rounded to one millisecond, instead of being rounded to zero.
- Issue #20262: Warnings are raised now when duplicate names are added in the - Issue #20262: Warnings are raised now when duplicate names are added in the
ZIP file or too long ZIP file comment is truncated. ZIP file or too long ZIP file comment is truncated.

View file

@ -1458,7 +1458,9 @@ pyepoll_poll(pyEpoll_Object *self, PyObject *args, PyObject *kwds)
return NULL; return NULL;
} }
else { else {
timeout = (int)(dtimeout * 1000.0); /* epoll_wait() has a resolution of 1 millisecond, round away from zero
to wait *at least* dtimeout seconds. */
timeout = (int)ceil(dtimeout * 1000.0);
} }
if (maxevents == -1) { if (maxevents == -1) {