[3.11] gh-110038: KqueueSelector must count all read/write events (GH-110039) (#110044)

[3.11] gh-110038: KqueueSelector must count all read/write events (GH-110039).
(cherry picked from commit b14f0ab51c)
This commit is contained in:
Davide Rizzo 2023-09-28 20:58:24 +02:00 committed by GitHub
parent 973d549e72
commit d6e8001467
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 38 additions and 1 deletions

View file

@ -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)