summaryrefslogtreecommitdiffstats
path: root/Lib/selectors.py
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@gmail.com>2014-01-31 11:12:53 (GMT)
committerVictor Stinner <victor.stinner@gmail.com>2014-01-31 11:12:53 (GMT)
commitdcd9740ad2932f4049e912d8721933696373fe4c (patch)
tree2827fc31b7e57e7bac925f338303c8acf33a1011 /Lib/selectors.py
parent31f65044a977307915412edffddcb4962a8928a3 (diff)
downloadcpython-dcd9740ad2932f4049e912d8721933696373fe4c.zip
cpython-dcd9740ad2932f4049e912d8721933696373fe4c.tar.gz
cpython-dcd9740ad2932f4049e912d8721933696373fe4c.tar.bz2
Issue #20452: select and selectors round (again) timeout away from zero for
poll and epoll Improve also debug info to analyze the issue
Diffstat (limited to 'Lib/selectors.py')
-rw-r--r--Lib/selectors.py10
1 files changed, 8 insertions, 2 deletions
diff --git a/Lib/selectors.py b/Lib/selectors.py
index b1b530a..52ee8db 100644
--- a/Lib/selectors.py
+++ b/Lib/selectors.py
@@ -8,6 +8,7 @@ This module allows high-level and efficient I/O multiplexing, built upon the
from abc import ABCMeta, abstractmethod, abstractproperty
from collections import namedtuple, Mapping
import functools
+import math
import select
import sys
@@ -369,8 +370,9 @@ if hasattr(select, 'poll'):
elif timeout <= 0:
timeout = 0
else:
- # Round towards zero
- timeout = int(timeout * 1000)
+ # poll() has a resolution of 1 millisecond, round away from
+ # zero to wait *at least* timeout seconds.
+ timeout = int(math.ceil(timeout * 1e3))
ready = []
try:
fd_event_list = self._poll.poll(timeout)
@@ -430,6 +432,10 @@ if hasattr(select, 'epoll'):
timeout = -1
elif timeout <= 0:
timeout = 0
+ else:
+ # epoll_wait() has a resolution of 1 millisecond, round away
+ # from zero to wait *at least* timeout seconds.
+ timeout = math.ceil(timeout * 1e3) * 1e-3
max_ev = len(self._fd_to_key)
ready = []
try: