mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
[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:
parent
973d549e72
commit
d6e8001467
3 changed files with 38 additions and 1 deletions
|
@ -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)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue