aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/Lib/selectors.py
diff options
context:
space:
mode:
authorJ. Nick Koston <nick@koston.org>2023-07-18 00:16:32 -1000
committerGitHub <noreply@github.com>2023-07-18 10:16:32 +0000
commitaecf6aca515a203a823a87c711f15cbb82097c8b (patch)
treea75ec1d49c31d8e186305393215f3b9b84190536 /Lib/selectors.py
parent4cb0b9c0a9f6a4154238c98013d2679229b1f794 (diff)
downloadcpython-aecf6aca515a203a823a87c711f15cbb82097c8b.tar.gz
cpython-aecf6aca515a203a823a87c711f15cbb82097c8b.zip
gh-106751: selectors: optimize EpollSelector.select() (#106754)
Co-authored-by: Pieter Eendebak <pieter.eendebak@gmail.com>
Diffstat (limited to 'Lib/selectors.py')
-rw-r--r--Lib/selectors.py17
1 files changed, 9 insertions, 8 deletions
diff --git a/Lib/selectors.py b/Lib/selectors.py
index 6d82935445d..a42d1563406 100644
--- a/Lib/selectors.py
+++ b/Lib/selectors.py
@@ -430,6 +430,9 @@ if hasattr(select, 'poll'):
if hasattr(select, 'epoll'):
+ _NOT_EPOLLIN = ~select.EPOLLIN
+ _NOT_EPOLLOUT = ~select.EPOLLOUT
+
class EpollSelector(_PollLikeSelector):
"""Epoll-based selector."""
_selector_cls = select.epoll
@@ -452,22 +455,20 @@ if hasattr(select, 'epoll'):
# epoll_wait() expects `maxevents` to be greater than zero;
# we want to make sure that `select()` can be called when no
# FD is registered.
- max_ev = max(len(self._fd_to_key), 1)
+ max_ev = len(self._fd_to_key) or 1
ready = []
try:
fd_event_list = self._selector.poll(timeout, max_ev)
except InterruptedError:
return ready
- for fd, event in fd_event_list:
- events = 0
- if event & ~select.EPOLLIN:
- events |= EVENT_WRITE
- if event & ~select.EPOLLOUT:
- events |= EVENT_READ
- key = self._fd_to_key.get(fd)
+ fd_to_key = self._fd_to_key
+ for fd, event in fd_event_list:
+ key = fd_to_key.get(fd)
if key:
+ events = ((event & _NOT_EPOLLIN and EVENT_WRITE)
+ | (event & _NOT_EPOLLOUT and EVENT_READ))
ready.append((key, events & key.events))
return ready