]> granicus.if.org Git - python/commitdiff
Issue #20311: select.epoll.poll() now rounds the timeout away from zero,
authorVictor Stinner <victor.stinner@gmail.com>
Tue, 21 Jan 2014 00:41:00 +0000 (01:41 +0100)
committerVictor Stinner <victor.stinner@gmail.com>
Tue, 21 Jan 2014 00:41:00 +0000 (01:41 +0100)
instead of rounding towards zero. For example, a timeout of one microsecond is
now rounded to one millisecond, instead of being rounded to zero.

Lib/test/test_epoll.py
Misc/NEWS
Modules/selectmodule.c

index 7f9547ff959316399344a3ca20e0b6e3c6c57798..ad545d3a3b15c0945c0c7dae575bc060aeade7b7 100644 (file)
@@ -46,6 +46,17 @@ class TestEPoll(unittest.TestCase):
         self.serverSocket.listen(1)
         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):
         for skt in self.connections:
index 62ffaa508a3b2bc4b40f605dec388a1614279e8d..e470fa90286325ffd94093d4181492493fe20730 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -43,6 +43,10 @@ Core and Builtins
 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
   ZIP file or too long ZIP file comment is truncated.
 
index c492224ecbcf32a4172f6ac4502b2cde220ca1ad..ab2016a981912efad5bc507c4fa2c3e07735180e 100644 (file)
@@ -1379,7 +1379,9 @@ pyepoll_poll(pyEpoll_Object *self, PyObject *args, PyObject *kwds)
         return NULL;
     }
     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) {