]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-29255: Wait in KqueueSelector.select when no fds are registered (GH-19508)
authorRussell Davis <551404+russelldavis@users.noreply.github.com>
Wed, 15 Apr 2020 18:57:06 +0000 (11:57 -0700)
committerGitHub <noreply@github.com>
Wed, 15 Apr 2020 18:57:06 +0000 (11:57 -0700)
Also partially fixes bpo-25680 (there's still a discrepancy in behavior
on Windows that needs to be fixed).

Lib/selectors.py
Lib/test/test_selectors.py
Misc/NEWS.d/next/Library/2020-04-14-11-31-07.bpo-29255.4EcyIN.rst [new file with mode: 0644]

index a9a0801ef0713bc92eea7d165e87c5595caf9696..90251dc34a0b34b2b94a5c4af66ae977f3369b6f 100644 (file)
@@ -552,7 +552,10 @@ if hasattr(select, 'kqueue'):
 
         def select(self, timeout=None):
             timeout = None if timeout is None else max(timeout, 0)
-            max_ev = len(self._fd_to_key)
+            # If max_ev is 0, kqueue will ignore the timeout. For consistent
+            # behavior with the other selector classes, we prevent that here
+            # (using max). See https://bugs.python.org/issue29255
+            max_ev = max(len(self._fd_to_key), 1)
             ready = []
             try:
                 kev_list = self._selector.control(None, max_ev, timeout)
index 31611224dc71e1f61c59d6ff058f0d0fc915a98d..c449155c4b49f1835e186093dddf6047a51fe656 100644 (file)
@@ -543,6 +543,19 @@ class KqueueSelectorTestCase(BaseSelectorTestCase, ScalableSelectorMixIn):
         with self.assertRaises(KeyError):
             s.get_key(bad_f)
 
+    def test_empty_select_timeout(self):
+        # Issues #23009, #29255: Make sure timeout is applied when no fds
+        # are registered.
+        s = self.SELECTOR()
+        self.addCleanup(s.close)
+
+        t0 = time()
+        self.assertEqual(s.select(1), [])
+        t1 = time()
+        dt = t1 - t0
+        # Tolerate 2.0 seconds for very slow buildbots
+        self.assertTrue(0.8 <= dt <= 2.0, dt)
+
 
 @unittest.skipUnless(hasattr(selectors, 'DevpollSelector'),
                      "Test needs selectors.DevpollSelector")
diff --git a/Misc/NEWS.d/next/Library/2020-04-14-11-31-07.bpo-29255.4EcyIN.rst b/Misc/NEWS.d/next/Library/2020-04-14-11-31-07.bpo-29255.4EcyIN.rst
new file mode 100644 (file)
index 0000000..18fbddf
--- /dev/null
@@ -0,0 +1 @@
+Wait in `KqueueSelector.select` when no fds are registered