cpython: 0a51a516bc70 (original) (raw)
Mercurial > cpython
changeset 89890:0a51a516bc70
Fix issue 18931: selectors module now supports /dev/poll on Solaris. [#18931]
Giampaolo Rodola' g.rodola@gmail.com | |
---|---|
date | Thu, 20 Mar 2014 21:43:41 +0100 |
parents | 2e4692a762d5 |
children | cbb18e801505 |
files | Doc/library/selectors.rst Lib/selectors.py Lib/test/test_selectors.py Misc/NEWS |
diffstat | 4 files changed, 84 insertions(+), 2 deletions(-)[+] [-] Doc/library/selectors.rst 11 Lib/selectors.py 62 Lib/test/test_selectors.py 10 Misc/NEWS 3 |
line wrap: on
line diff
--- a/Doc/library/selectors.rst +++ b/Doc/library/selectors.rst @@ -45,6 +45,7 @@ Classes hierarchy:: +-- SelectSelector +-- PollSelector +-- EpollSelector
@@ -207,6 +208,16 @@ below:
This returns the file descriptor used by the underlying
:func:select.epoll
object.
+.. class:: DevpollSelector()
+
- :func:
select.devpoll
-based selector. + - .. method:: fileno() +
This returns the file descriptor used by the underlying[](#l1.21)
:func:`select.devpoll` object.[](#l1.22)
+ +.. versionadded:: 3.5 .. class:: KqueueSelector()
--- a/Lib/selectors.py +++ b/Lib/selectors.py @@ -441,6 +441,64 @@ if hasattr(select, 'epoll'): super().close() +if hasattr(select, 'devpoll'): +
def __init__(self):[](#l2.12)
super().__init__()[](#l2.13)
self._devpoll = select.devpoll()[](#l2.14)
def fileno(self):[](#l2.16)
return self._devpoll.fileno()[](#l2.17)
def register(self, fileobj, events, data=None):[](#l2.19)
key = super().register(fileobj, events, data)[](#l2.20)
poll_events = 0[](#l2.21)
if events & EVENT_READ:[](#l2.22)
poll_events |= select.POLLIN[](#l2.23)
if events & EVENT_WRITE:[](#l2.24)
poll_events |= select.POLLOUT[](#l2.25)
self._devpoll.register(key.fd, poll_events)[](#l2.26)
return key[](#l2.27)
def unregister(self, fileobj):[](#l2.29)
key = super().unregister(fileobj)[](#l2.30)
self._devpoll.unregister(key.fd)[](#l2.31)
return key[](#l2.32)
def select(self, timeout=None):[](#l2.34)
if timeout is None:[](#l2.35)
timeout = None[](#l2.36)
elif timeout <= 0:[](#l2.37)
timeout = 0[](#l2.38)
else:[](#l2.39)
# devpoll() has a resolution of 1 millisecond, round away from[](#l2.40)
# zero to wait *at least* timeout seconds.[](#l2.41)
timeout = math.ceil(timeout * 1e3)[](#l2.42)
ready = [][](#l2.43)
try:[](#l2.44)
fd_event_list = self._devpoll.poll(timeout)[](#l2.45)
except InterruptedError:[](#l2.46)
return ready[](#l2.47)
for fd, event in fd_event_list:[](#l2.48)
events = 0[](#l2.49)
if event & ~select.POLLIN:[](#l2.50)
events |= EVENT_WRITE[](#l2.51)
if event & ~select.POLLOUT:[](#l2.52)
events |= EVENT_READ[](#l2.53)
key = self._key_from_fd(fd)[](#l2.55)
if key:[](#l2.56)
ready.append((key, events & key.events))[](#l2.57)
return ready[](#l2.58)
def close(self):[](#l2.60)
self._devpoll.close()[](#l2.61)
super().close()[](#l2.62)
+ + if hasattr(select, 'kqueue'): class KqueueSelector(_BaseSelectorImpl): @@ -513,12 +571,14 @@ if hasattr(select, 'kqueue'): super().close() -# Choose the best implementation: roughly, epoll|kqueue > poll > select. +# Choose the best implementation: roughly, epoll|kqueue|devpoll > poll > select.
select() also can't accept a FD > FD_SETSIZE (usually around 1024)
if 'KqueueSelector' in globals(): DefaultSelector = KqueueSelector elif 'EpollSelector' in globals(): DefaultSelector = EpollSelector +elif 'DevpollSelector' in globals():
elif 'PollSelector' in globals(): DefaultSelector = PollSelector else:
--- a/Lib/test/test_selectors.py +++ b/Lib/test/test_selectors.py @@ -441,10 +441,18 @@ class KqueueSelectorTestCase(BaseSelecto SELECTOR = getattr(selectors, 'KqueueSelector', None) +@unittest.skipUnless(hasattr(selectors, 'DevpollSelector'),
"Test needs selectors.DevpollSelector")[](#l3.8)
+class DevpollSelectorTestCase(BaseSelectorTestCase, ScalableSelectorMixIn): +
+ + + def test_main(): tests = [DefaultSelectorTestCase, SelectSelectorTestCase, PollSelectorTestCase, EpollSelectorTestCase,
KqueueSelectorTestCase][](#l3.18)
support.run_unittest(*tests) support.reap_children()KqueueSelectorTestCase, DevpollSelectorTestCase][](#l3.19)
--- a/Misc/NEWS +++ b/Misc/NEWS @@ -23,6 +23,9 @@ Core and Builtins Library ------- +- Issue 18931: selectors module now supports /dev/poll on Solaris.