aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/python/Twisted/py2/twisted/internet/pollreactor.py
diff options
context:
space:
mode:
authorshmel1k <shmel1k@ydb.tech>2023-11-26 18:16:14 +0300
committershmel1k <shmel1k@ydb.tech>2023-11-26 18:43:30 +0300
commitb8cf9e88f4c5c64d9406af533d8948deb050d695 (patch)
tree218eb61fb3c3b96ec08b4d8cdfef383104a87d63 /contrib/python/Twisted/py2/twisted/internet/pollreactor.py
parent523f645a83a0ec97a0332dbc3863bb354c92a328 (diff)
downloadydb-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.py189
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"]