diff options
author | shmel1k <shmel1k@ydb.tech> | 2023-11-26 18:16:14 +0300 |
---|---|---|
committer | shmel1k <shmel1k@ydb.tech> | 2023-11-26 18:43:30 +0300 |
commit | b8cf9e88f4c5c64d9406af533d8948deb050d695 (patch) | |
tree | 218eb61fb3c3b96ec08b4d8cdfef383104a87d63 /contrib/python/Twisted/py2/twisted/internet/pollreactor.py | |
parent | 523f645a83a0ec97a0332dbc3863bb354c92a328 (diff) | |
download | ydb-b8cf9e88f4c5c64d9406af533d8948deb050d695.tar.gz |
add kikimr_configure
Diffstat (limited to 'contrib/python/Twisted/py2/twisted/internet/pollreactor.py')
-rw-r--r-- | contrib/python/Twisted/py2/twisted/internet/pollreactor.py | 189 |
1 files changed, 189 insertions, 0 deletions
diff --git a/contrib/python/Twisted/py2/twisted/internet/pollreactor.py b/contrib/python/Twisted/py2/twisted/internet/pollreactor.py new file mode 100644 index 0000000000..fe2fea5648 --- /dev/null +++ b/contrib/python/Twisted/py2/twisted/internet/pollreactor.py @@ -0,0 +1,189 @@ +# Copyright (c) Twisted Matrix Laboratories. +# See LICENSE for details. + +""" +A poll() based implementation of the twisted main loop. + +To install the event loop (and you should do this before any connections, +listeners or connectors are added):: + + from twisted.internet import pollreactor + pollreactor.install() +""" + +from __future__ import division, absolute_import + +# System imports +import errno +from select import error as SelectError, poll +from select import POLLIN, POLLOUT, POLLHUP, POLLERR, POLLNVAL + +from zope.interface import implementer + +# Twisted imports +from twisted.python import log +from twisted.internet import posixbase +from twisted.internet.interfaces import IReactorFDSet + + + +@implementer(IReactorFDSet) +class PollReactor(posixbase.PosixReactorBase, posixbase._PollLikeMixin): + """ + A reactor that uses poll(2). + + @ivar _poller: A L{select.poll} which will be used to check for I/O + readiness. + + @ivar _selectables: A dictionary mapping integer file descriptors to + instances of L{FileDescriptor} which have been registered with the + reactor. All L{FileDescriptor}s which are currently receiving read or + write readiness notifications will be present as values in this + dictionary. + + @ivar _reads: A dictionary mapping integer file descriptors to arbitrary + values (this is essentially a set). Keys in this dictionary will be + registered with C{_poller} for read readiness notifications which will + be dispatched to the corresponding L{FileDescriptor} instances in + C{_selectables}. + + @ivar _writes: A dictionary mapping integer file descriptors to arbitrary + values (this is essentially a set). Keys in this dictionary will be + registered with C{_poller} for write readiness notifications which will + be dispatched to the corresponding L{FileDescriptor} instances in + C{_selectables}. + """ + + _POLL_DISCONNECTED = (POLLHUP | POLLERR | POLLNVAL) + _POLL_IN = POLLIN + _POLL_OUT = POLLOUT + + def __init__(self): + """ + Initialize polling object, file descriptor tracking dictionaries, and + the base class. + """ + self._poller = poll() + self._selectables = {} + self._reads = {} + self._writes = {} + posixbase.PosixReactorBase.__init__(self) + + + def _updateRegistration(self, fd): + """Register/unregister an fd with the poller.""" + try: + self._poller.unregister(fd) + except KeyError: + pass + + mask = 0 + if fd in self._reads: + mask = mask | POLLIN + if fd in self._writes: + mask = mask | POLLOUT + if mask != 0: + self._poller.register(fd, mask) + else: + if fd in self._selectables: + del self._selectables[fd] + + def _dictRemove(self, selectable, mdict): + try: + # the easy way + fd = selectable.fileno() + # make sure the fd is actually real. In some situations we can get + # -1 here. + mdict[fd] + except: + # the hard way: necessary because fileno() may disappear at any + # moment, thanks to python's underlying sockets impl + for fd, fdes in self._selectables.items(): + if selectable is fdes: + break + else: + # Hmm, maybe not the right course of action? This method can't + # fail, because it happens inside error detection... + return + if fd in mdict: + del mdict[fd] + self._updateRegistration(fd) + + def addReader(self, reader): + """Add a FileDescriptor for notification of data available to read. + """ + fd = reader.fileno() + if fd not in self._reads: + self._selectables[fd] = reader + self._reads[fd] = 1 + self._updateRegistration(fd) + + def addWriter(self, writer): + """Add a FileDescriptor for notification of data available to write. + """ + fd = writer.fileno() + if fd not in self._writes: + self._selectables[fd] = writer + self._writes[fd] = 1 + self._updateRegistration(fd) + + def removeReader(self, reader): + """Remove a Selectable for notification of data available to read. + """ + return self._dictRemove(reader, self._reads) + + def removeWriter(self, writer): + """Remove a Selectable for notification of data available to write. + """ + return self._dictRemove(writer, self._writes) + + def removeAll(self): + """ + Remove all selectables, and return a list of them. + """ + return self._removeAll( + [self._selectables[fd] for fd in self._reads], + [self._selectables[fd] for fd in self._writes]) + + + def doPoll(self, timeout): + """Poll the poller for new events.""" + if timeout is not None: + timeout = int(timeout * 1000) # convert seconds to milliseconds + + try: + l = self._poller.poll(timeout) + except SelectError as e: + if e.args[0] == errno.EINTR: + return + else: + raise + _drdw = self._doReadOrWrite + for fd, event in l: + try: + selectable = self._selectables[fd] + except KeyError: + # Handles the infrequent case where one selectable's + # handler disconnects another. + continue + log.callWithLogger(selectable, _drdw, selectable, fd, event) + + doIteration = doPoll + + def getReaders(self): + return [self._selectables[fd] for fd in self._reads] + + + def getWriters(self): + return [self._selectables[fd] for fd in self._writes] + + + +def install(): + """Install the poll() reactor.""" + p = PollReactor() + from twisted.internet.main import installReactor + installReactor(p) + + +__all__ = ["PollReactor", "install"] |