| Index: third_party/twisted_8_1/twisted/internet/selectreactor.py
|
| diff --git a/third_party/twisted_8_1/twisted/internet/selectreactor.py b/third_party/twisted_8_1/twisted/internet/selectreactor.py
|
| deleted file mode 100644
|
| index 0d79e55fb3a4f77a087642fed8fa467f61147382..0000000000000000000000000000000000000000
|
| --- a/third_party/twisted_8_1/twisted/internet/selectreactor.py
|
| +++ /dev/null
|
| @@ -1,204 +0,0 @@
|
| -# -*- test-case-name: twisted.test.test_internet -*-
|
| -# Copyright (c) 2001-2007 Twisted Matrix Laboratories.
|
| -# See LICENSE for details.
|
| -
|
| -
|
| -"""
|
| -Select reactor
|
| -
|
| -Maintainer: U{Itamar Shtull-Trauring<mailto:twisted@itamarst.org>}
|
| -"""
|
| -
|
| -from time import sleep
|
| -import sys
|
| -import select
|
| -from errno import EINTR, EBADF
|
| -
|
| -from zope.interface import implements
|
| -
|
| -from twisted.internet.interfaces import IReactorFDSet
|
| -from twisted.internet import error
|
| -from twisted.internet import posixbase
|
| -from twisted.python import log
|
| -from twisted.python.runtime import platformType
|
| -
|
| -
|
| -def win32select(r, w, e, timeout=None):
|
| - """Win32 select wrapper."""
|
| - if not (r or w):
|
| - # windows select() exits immediately when no sockets
|
| - if timeout is None:
|
| - timeout = 0.01
|
| - else:
|
| - timeout = min(timeout, 0.001)
|
| - sleep(timeout)
|
| - return [], [], []
|
| - # windows doesn't process 'signals' inside select(), so we set a max
|
| - # time or ctrl-c will never be recognized
|
| - if timeout is None or timeout > 0.5:
|
| - timeout = 0.5
|
| - r, w, e = select.select(r, w, w, timeout)
|
| - return r, w + e, []
|
| -
|
| -if platformType == "win32":
|
| - _select = win32select
|
| -else:
|
| - _select = select.select
|
| -
|
| -# Exceptions that doSelect might return frequently
|
| -_NO_FILENO = error.ConnectionFdescWentAway('Handler has no fileno method')
|
| -_NO_FILEDESC = error.ConnectionFdescWentAway('Filedescriptor went away')
|
| -
|
| -class SelectReactor(posixbase.PosixReactorBase):
|
| - """
|
| - A select() based reactor - runs on all POSIX platforms and on Win32.
|
| -
|
| - @ivar _reads: A dictionary mapping L{FileDescriptor} instances to arbitrary
|
| - values (this is essentially a set). Keys in this dictionary will be
|
| - checked for read events.
|
| -
|
| - @ivar _writes: A dictionary mapping L{FileDescriptor} instances to
|
| - arbitrary values (this is essentially a set). Keys in this dictionary
|
| - will be checked for writability.
|
| - """
|
| - implements(IReactorFDSet)
|
| -
|
| - def __init__(self):
|
| - """
|
| - Initialize file descriptor tracking dictionaries and the base class.
|
| - """
|
| - self._reads = {}
|
| - self._writes = {}
|
| - posixbase.PosixReactorBase.__init__(self)
|
| -
|
| -
|
| - def _preenDescriptors(self):
|
| - log.msg("Malformed file descriptor found. Preening lists.")
|
| - readers = self._reads.keys()
|
| - writers = self._writes.keys()
|
| - self._reads.clear()
|
| - self._writes.clear()
|
| - for selDict, selList in ((self._reads, readers),
|
| - (self._writes, writers)):
|
| - for selectable in selList:
|
| - try:
|
| - select.select([selectable], [selectable], [selectable], 0)
|
| - except Exception, e:
|
| - log.msg("bad descriptor %s" % selectable)
|
| - self._disconnectSelectable(selectable, e, False)
|
| - else:
|
| - selDict[selectable] = 1
|
| -
|
| -
|
| - def doSelect(self, timeout):
|
| - """
|
| - Run one iteration of the I/O monitor loop.
|
| -
|
| - This will run all selectables who had input or output readiness
|
| - waiting for them.
|
| - """
|
| - while 1:
|
| - try:
|
| - r, w, ignored = _select(self._reads.keys(),
|
| - self._writes.keys(),
|
| - [], timeout)
|
| - break
|
| - except ValueError, ve:
|
| - # Possibly a file descriptor has gone negative?
|
| - log.err()
|
| - self._preenDescriptors()
|
| - except TypeError, te:
|
| - # Something *totally* invalid (object w/o fileno, non-integral
|
| - # result) was passed
|
| - log.err()
|
| - self._preenDescriptors()
|
| - except (select.error, IOError), se:
|
| - # select(2) encountered an error
|
| - if se.args[0] in (0, 2):
|
| - # windows does this if it got an empty list
|
| - if (not self._reads) and (not self._writes):
|
| - return
|
| - else:
|
| - raise
|
| - elif se.args[0] == EINTR:
|
| - return
|
| - elif se.args[0] == EBADF:
|
| - self._preenDescriptors()
|
| - else:
|
| - # OK, I really don't know what's going on. Blow up.
|
| - raise
|
| - _drdw = self._doReadOrWrite
|
| - _logrun = log.callWithLogger
|
| - for selectables, method, fdset in ((r, "doRead", self._reads),
|
| - (w,"doWrite", self._writes)):
|
| - for selectable in selectables:
|
| - # if this was disconnected in another thread, kill it.
|
| - # ^^^^ --- what the !@#*? serious! -exarkun
|
| - if selectable not in fdset:
|
| - continue
|
| - # This for pausing input when we're not ready for more.
|
| - _logrun(selectable, _drdw, selectable, method, dict)
|
| -
|
| - doIteration = doSelect
|
| -
|
| - def _doReadOrWrite(self, selectable, method, dict):
|
| - try:
|
| - why = getattr(selectable, method)()
|
| - handfn = getattr(selectable, 'fileno', None)
|
| - if not handfn:
|
| - why = _NO_FILENO
|
| - elif handfn() == -1:
|
| - why = _NO_FILEDESC
|
| - except:
|
| - why = sys.exc_info()[1]
|
| - log.err()
|
| - if why:
|
| - self._disconnectSelectable(selectable, why, method=="doRead")
|
| -
|
| - def addReader(self, reader):
|
| - """
|
| - Add a FileDescriptor for notification of data available to read.
|
| - """
|
| - self._reads[reader] = 1
|
| -
|
| - def addWriter(self, writer):
|
| - """
|
| - Add a FileDescriptor for notification of data available to write.
|
| - """
|
| - self._writes[writer] = 1
|
| -
|
| - def removeReader(self, reader):
|
| - """
|
| - Remove a Selectable for notification of data available to read.
|
| - """
|
| - if reader in self._reads:
|
| - del self._reads[reader]
|
| -
|
| - def removeWriter(self, writer):
|
| - """
|
| - Remove a Selectable for notification of data available to write.
|
| - """
|
| - if writer in self._writes:
|
| - del self._writes[writer]
|
| -
|
| - def removeAll(self):
|
| - return self._removeAll(self._reads, self._writes)
|
| -
|
| -
|
| - def getReaders(self):
|
| - return self._reads.keys()
|
| -
|
| -
|
| - def getWriters(self):
|
| - return self._writes.keys()
|
| -
|
| -
|
| -
|
| -def install():
|
| - """Configure the twisted mainloop to be run using the select() reactor.
|
| - """
|
| - reactor = SelectReactor()
|
| - from twisted.internet.main import installReactor
|
| - installReactor(reactor)
|
| -
|
| -__all__ = ['install']
|
|
|