diff options
author | Davide Rizzo <sorcio@gmail.com> | 2023-10-02 15:42:55 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-10-02 15:42:55 (GMT) |
commit | c7941034171cd608a0235731832b7784200dec70 (patch) | |
tree | cd9ea92c6b466a54c77e73d67cbd0d84269cea18 /Lib/selectors.py | |
parent | 4bdcb99469ed4d9e4ab2ef3586985a081a18b2bb (diff) | |
download | cpython-c7941034171cd608a0235731832b7784200dec70.zip cpython-c7941034171cd608a0235731832b7784200dec70.tar.gz cpython-c7941034171cd608a0235731832b7784200dec70.tar.bz2 |
[3.12] gh-110038: KqueueSelector must count all read/write events (GH-110039) (#110043)
[3.12] gh-110038: KqueueSelector must count all read/write events (GH-110039).
(cherry picked from commit b14f0ab51cb4851b25935279617e388456dcf716)
Diffstat (limited to 'Lib/selectors.py')
-rw-r--r-- | Lib/selectors.py | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/Lib/selectors.py b/Lib/selectors.py index af6a4f9..c3b065b 100644 --- a/Lib/selectors.py +++ b/Lib/selectors.py @@ -509,6 +509,7 @@ if hasattr(select, 'kqueue'): def __init__(self): super().__init__() self._selector = select.kqueue() + self._max_events = 0 def fileno(self): return self._selector.fileno() @@ -520,10 +521,12 @@ if hasattr(select, 'kqueue'): kev = select.kevent(key.fd, select.KQ_FILTER_READ, select.KQ_EV_ADD) self._selector.control([kev], 0, 0) + self._max_events += 1 if events & EVENT_WRITE: kev = select.kevent(key.fd, select.KQ_FILTER_WRITE, select.KQ_EV_ADD) self._selector.control([kev], 0, 0) + self._max_events += 1 except: super().unregister(fileobj) raise @@ -534,6 +537,7 @@ if hasattr(select, 'kqueue'): if key.events & EVENT_READ: kev = select.kevent(key.fd, select.KQ_FILTER_READ, select.KQ_EV_DELETE) + self._max_events -= 1 try: self._selector.control([kev], 0, 0) except OSError: @@ -543,6 +547,7 @@ if hasattr(select, 'kqueue'): if key.events & EVENT_WRITE: kev = select.kevent(key.fd, select.KQ_FILTER_WRITE, select.KQ_EV_DELETE) + self._max_events -= 1 try: self._selector.control([kev], 0, 0) except OSError: @@ -555,7 +560,7 @@ if hasattr(select, 'kqueue'): # 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) + max_ev = self._max_events or 1 ready = [] try: kev_list = self._selector.control(None, max_ev, timeout) |