summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@gmail.com>2015-03-30 19:16:11 (GMT)
committerVictor Stinner <victor.stinner@gmail.com>2015-03-30 19:16:11 (GMT)
commitf70e1ca0fc30426d12aa8fc6684764ee11a66777 (patch)
treeadde4b05e331c51ea39f603aff8171ca1527cef6 /Lib
parent3f5d48bead8e937aef6f94a3211406270c1a5f8f (diff)
downloadcpython-f70e1ca0fc30426d12aa8fc6684764ee11a66777.zip
cpython-f70e1ca0fc30426d12aa8fc6684764ee11a66777.tar.gz
cpython-f70e1ca0fc30426d12aa8fc6684764ee11a66777.tar.bz2
Issue #23485: select.select() is now retried automatically with the recomputed
timeout when interrupted by a signal, except if the signal handler raises an exception. This change is part of the PEP 475. The asyncore and selectors module doesn't catch the InterruptedError exception anymore when calling select.select(), since this function should not raise InterruptedError anymore.
Diffstat (limited to 'Lib')
-rw-r--r--Lib/asyncore.py5
-rw-r--r--Lib/selectors.py5
-rw-r--r--Lib/test/eintrdata/eintr_tester.py16
3 files changed, 17 insertions, 9 deletions
diff --git a/Lib/asyncore.py b/Lib/asyncore.py
index 68efd45..5578dda 100644
--- a/Lib/asyncore.py
+++ b/Lib/asyncore.py
@@ -141,10 +141,7 @@ def poll(timeout=0.0, map=None):
time.sleep(timeout)
return
- try:
- r, w, e = select.select(r, w, e, timeout)
- except InterruptedError:
- return
+ r, w, e = select.select(r, w, e, timeout)
for fd in r:
obj = map.get(fd)
diff --git a/Lib/selectors.py b/Lib/selectors.py
index 6d569c3..4f2a377 100644
--- a/Lib/selectors.py
+++ b/Lib/selectors.py
@@ -310,10 +310,7 @@ class SelectSelector(_BaseSelectorImpl):
def select(self, timeout=None):
timeout = None if timeout is None else max(timeout, 0)
ready = []
- try:
- r, w, _ = self._select(self._readers, self._writers, [], timeout)
- except InterruptedError:
- return ready
+ r, w, _ = self._select(self._readers, self._writers, [], timeout)
r = set(r)
w = set(w)
for fd in r | w:
diff --git a/Lib/test/eintrdata/eintr_tester.py b/Lib/test/eintrdata/eintr_tester.py
index ba056fb..82cef83 100644
--- a/Lib/test/eintrdata/eintr_tester.py
+++ b/Lib/test/eintrdata/eintr_tester.py
@@ -10,6 +10,7 @@ sub-second periodicity (contrarily to signal()).
import io
import os
+import select
import signal
import socket
import time
@@ -303,12 +304,25 @@ class SignalEINTRTest(EINTRBaseTest):
self.assertGreaterEqual(dt, self.sleep_time)
+@unittest.skipUnless(hasattr(signal, "setitimer"), "requires setitimer()")
+class SelectEINTRTest(EINTRBaseTest):
+ """ EINTR tests for the select module. """
+
+ def test_select(self):
+ t0 = time.monotonic()
+ select.select([], [], [], self.sleep_time)
+ signal.alarm(0)
+ dt = time.monotonic() - t0
+ self.assertGreaterEqual(dt, self.sleep_time)
+
+
def test_main():
support.run_unittest(
OSEINTRTest,
SocketEINTRTest,
TimeEINTRTest,
- SignalEINTRTest)
+ SignalEINTRTest,
+ SelectEINTRTest)
if __name__ == "__main__":