Issue #23485: select.poll.poll() is now retried when interrupted by a signal
diff --git a/Lib/asyncore.py b/Lib/asyncore.py
index 5578dda..3b51f0f 100644
--- a/Lib/asyncore.py
+++ b/Lib/asyncore.py
@@ -179,10 +179,8 @@
flags |= select.POLLOUT
if flags:
pollster.register(fd, flags)
- try:
- r = pollster.poll(timeout)
- except InterruptedError:
- r = []
+
+ r = pollster.poll(timeout)
for fd, flags in r:
obj = map.get(fd)
if obj is None:
diff --git a/Lib/selectors.py b/Lib/selectors.py
index 4f2a377..bf48ebf 100644
--- a/Lib/selectors.py
+++ b/Lib/selectors.py
@@ -359,11 +359,10 @@
# poll() has a resolution of 1 millisecond, round away from
# zero to wait *at least* timeout seconds.
timeout = math.ceil(timeout * 1e3)
+
+ fd_event_list = self._poll.poll(timeout)
+
ready = []
- try:
- fd_event_list = self._poll.poll(timeout)
- except InterruptedError:
- return ready
for fd, event in fd_event_list:
events = 0
if event & ~select.POLLIN:
diff --git a/Lib/test/eintrdata/eintr_tester.py b/Lib/test/eintrdata/eintr_tester.py
index 82cef83..3da964d 100644
--- a/Lib/test/eintrdata/eintr_tester.py
+++ b/Lib/test/eintrdata/eintr_tester.py
@@ -38,8 +38,12 @@
cls.signal_period)
@classmethod
- def tearDownClass(cls):
+ def stop_alarm(cls):
signal.setitimer(signal.ITIMER_REAL, 0, 0)
+
+ @classmethod
+ def tearDownClass(cls):
+ cls.stop_alarm()
signal.signal(signal.SIGALRM, cls.orig_handler)
@classmethod
@@ -260,7 +264,7 @@
def test_sleep(self):
t0 = time.monotonic()
time.sleep(self.sleep_time)
- signal.alarm(0)
+ self.stop_alarm()
dt = time.monotonic() - t0
self.assertGreaterEqual(dt, self.sleep_time)
@@ -311,7 +315,17 @@
def test_select(self):
t0 = time.monotonic()
select.select([], [], [], self.sleep_time)
- signal.alarm(0)
+ self.stop_alarm()
+ dt = time.monotonic() - t0
+ self.assertGreaterEqual(dt, self.sleep_time)
+
+ @unittest.skipUnless(hasattr(select, 'poll'), 'need select.poll')
+ def test_poll(self):
+ poller = select.poll()
+
+ t0 = time.monotonic()
+ poller.poll(self.sleep_time * 1e3)
+ self.stop_alarm()
dt = time.monotonic() - t0
self.assertGreaterEqual(dt, self.sleep_time)