Issue #23485: select.epoll.poll() is now retried when interrupted by a signal
diff --git a/Lib/selectors.py b/Lib/selectors.py
index bf48ebf..2a0a44c 100644
--- a/Lib/selectors.py
+++ b/Lib/selectors.py
@@ -423,11 +423,9 @@
# FD is registered.
max_ev = max(len(self._fd_to_key), 1)
+ fd_event_list = self._epoll.poll(timeout, max_ev)
+
ready = []
- try:
- fd_event_list = self._epoll.poll(timeout, max_ev)
- except InterruptedError:
- return ready
for fd, event in fd_event_list:
events = 0
if event & ~select.EPOLLIN:
diff --git a/Lib/test/eintrdata/eintr_tester.py b/Lib/test/eintrdata/eintr_tester.py
index 3da964d..0df9762 100644
--- a/Lib/test/eintrdata/eintr_tester.py
+++ b/Lib/test/eintrdata/eintr_tester.py
@@ -329,6 +329,17 @@
dt = time.monotonic() - t0
self.assertGreaterEqual(dt, self.sleep_time)
+ @unittest.skipUnless(hasattr(select, 'epoll'), 'need select.epoll')
+ def test_epoll(self):
+ poller = select.epoll()
+ self.addCleanup(poller.close)
+
+ t0 = time.monotonic()
+ poller.poll(self.sleep_time)
+ self.stop_alarm()
+ dt = time.monotonic() - t0
+ self.assertGreaterEqual(dt, self.sleep_time)
+
def test_main():
support.run_unittest(