| Index: third_party/twisted_8_1/twisted/internet/posixbase.py
|
| diff --git a/third_party/twisted_8_1/twisted/internet/posixbase.py b/third_party/twisted_8_1/twisted/internet/posixbase.py
|
| deleted file mode 100644
|
| index b0fc0f9920b8e1f93a6ae7ed6ad919394dfc1a96..0000000000000000000000000000000000000000
|
| --- a/third_party/twisted_8_1/twisted/internet/posixbase.py
|
| +++ /dev/null
|
| @@ -1,406 +0,0 @@
|
| -# -*- test-case-name: twisted.test.test_internet -*-
|
| -#
|
| -# Copyright (c) 2001-2008 Twisted Matrix Laboratories.
|
| -# See LICENSE for details.
|
| -
|
| -
|
| -"""
|
| -Posix reactor base class
|
| -
|
| -Maintainer: U{Itamar Shtull-Trauring<mailto:twisted@itamarst.org>}
|
| -"""
|
| -
|
| -import warnings
|
| -import socket
|
| -import errno
|
| -import os
|
| -
|
| -from zope.interface import implements, classImplements
|
| -
|
| -from twisted.internet.interfaces import IReactorUNIX, IReactorUNIXDatagram
|
| -from twisted.internet.interfaces import IReactorTCP, IReactorUDP, IReactorSSL, IReactorArbitrary
|
| -from twisted.internet.interfaces import IReactorProcess, IReactorMulticast
|
| -from twisted.internet.interfaces import IHalfCloseableDescriptor
|
| -from twisted.internet import error
|
| -from twisted.internet import tcp, udp
|
| -
|
| -from twisted.python import log, failure, util
|
| -from twisted.persisted import styles
|
| -from twisted.python.runtime import platformType, platform
|
| -
|
| -from twisted.internet.base import ReactorBase, _SignalReactorMixin
|
| -
|
| -try:
|
| - from twisted.internet import ssl
|
| - sslEnabled = True
|
| -except ImportError:
|
| - sslEnabled = False
|
| -
|
| -try:
|
| - from twisted.internet import unix
|
| - unixEnabled = True
|
| -except ImportError:
|
| - unixEnabled = False
|
| -
|
| -processEnabled = False
|
| -if platformType == 'posix':
|
| - from twisted.internet import fdesc
|
| - import process
|
| - processEnabled = True
|
| -
|
| -if platform.isWindows():
|
| - try:
|
| - import win32process
|
| - processEnabled = True
|
| - except ImportError:
|
| - win32process = None
|
| -
|
| -
|
| -class _Win32Waker(log.Logger, styles.Ephemeral):
|
| - """I am a workaround for the lack of pipes on win32.
|
| -
|
| - I am a pair of connected sockets which can wake up the main loop
|
| - from another thread.
|
| - """
|
| - disconnected = 0
|
| -
|
| - def __init__(self, reactor):
|
| - """Initialize.
|
| - """
|
| - self.reactor = reactor
|
| - # Following select_trigger (from asyncore)'s example;
|
| - server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
| - client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
| - client.setsockopt(socket.IPPROTO_TCP, 1, 1)
|
| - server.bind(('127.0.0.1', 0))
|
| - server.listen(1)
|
| - client.connect(server.getsockname())
|
| - reader, clientaddr = server.accept()
|
| - client.setblocking(0)
|
| - reader.setblocking(0)
|
| - self.r = reader
|
| - self.w = client
|
| - self.fileno = self.r.fileno
|
| -
|
| - def wakeUp(self):
|
| - """Send a byte to my connection.
|
| - """
|
| - try:
|
| - util.untilConcludes(self.w.send, 'x')
|
| - except socket.error, (err, msg):
|
| - if err != errno.WSAEWOULDBLOCK:
|
| - raise
|
| -
|
| - def doRead(self):
|
| - """Read some data from my connection.
|
| - """
|
| - try:
|
| - self.r.recv(8192)
|
| - except socket.error:
|
| - pass
|
| -
|
| - def connectionLost(self, reason):
|
| - self.r.close()
|
| - self.w.close()
|
| - self.reactor.waker = None
|
| -
|
| -class _UnixWaker(log.Logger, styles.Ephemeral):
|
| - """This class provides a simple interface to wake up the event loop.
|
| -
|
| - This is used by threads or signals to wake up the event loop.
|
| - """
|
| - disconnected = 0
|
| -
|
| - i = None
|
| - o = None
|
| -
|
| - def __init__(self, reactor):
|
| - """Initialize.
|
| - """
|
| - self.reactor = reactor
|
| - self.i, self.o = os.pipe()
|
| - fdesc.setNonBlocking(self.i)
|
| - fdesc.setNonBlocking(self.o)
|
| - self.fileno = lambda: self.i
|
| -
|
| - def doRead(self):
|
| - """Read some bytes from the pipe.
|
| - """
|
| - fdesc.readFromFD(self.fileno(), lambda data: None)
|
| -
|
| - def wakeUp(self):
|
| - """Write one byte to the pipe, and flush it.
|
| - """
|
| - # We don't use fdesc.writeToFD since we need to distinguish
|
| - # between EINTR (try again) and EAGAIN (do nothing).
|
| - if self.o is not None:
|
| - try:
|
| - util.untilConcludes(os.write, self.o, 'x')
|
| - except OSError, e:
|
| - if e.errno != errno.EAGAIN:
|
| - raise
|
| -
|
| - def connectionLost(self, reason):
|
| - """Close both ends of my pipe.
|
| - """
|
| - if not hasattr(self, "o"):
|
| - return
|
| - for fd in self.i, self.o:
|
| - try:
|
| - os.close(fd)
|
| - except IOError:
|
| - pass
|
| - del self.i, self.o
|
| - self.reactor.waker = None
|
| -
|
| -
|
| -if platformType == 'posix':
|
| - _Waker = _UnixWaker
|
| -elif platformType == 'win32':
|
| - _Waker = _Win32Waker
|
| -
|
| -
|
| -class PosixReactorBase(_SignalReactorMixin, ReactorBase):
|
| - """
|
| - A basis for reactors that use file descriptors.
|
| - """
|
| - implements(IReactorArbitrary, IReactorTCP, IReactorUDP, IReactorMulticast)
|
| -
|
| - def __init__(self):
|
| - ReactorBase.__init__(self)
|
| - if self.usingThreads or platformType == "posix":
|
| - self.installWaker()
|
| -
|
| -
|
| - def _disconnectSelectable(self, selectable, why, isRead, faildict={
|
| - error.ConnectionDone: failure.Failure(error.ConnectionDone()),
|
| - error.ConnectionLost: failure.Failure(error.ConnectionLost())
|
| - }):
|
| - """
|
| - Utility function for disconnecting a selectable.
|
| -
|
| - Supports half-close notification, isRead should be boolean indicating
|
| - whether error resulted from doRead().
|
| - """
|
| - self.removeReader(selectable)
|
| - f = faildict.get(why.__class__)
|
| - if f:
|
| - if (isRead and why.__class__ == error.ConnectionDone
|
| - and IHalfCloseableDescriptor.providedBy(selectable)):
|
| - selectable.readConnectionLost(f)
|
| - else:
|
| - self.removeWriter(selectable)
|
| - selectable.connectionLost(f)
|
| - else:
|
| - self.removeWriter(selectable)
|
| - selectable.connectionLost(failure.Failure(why))
|
| -
|
| - def installWaker(self):
|
| - """
|
| - Install a `waker' to allow threads and signals to wake up the IO thread.
|
| -
|
| - We use the self-pipe trick (http://cr.yp.to/docs/selfpipe.html) to wake
|
| - the reactor. On Windows we use a pair of sockets.
|
| - """
|
| - if not self.waker:
|
| - self.waker = _Waker(self)
|
| - self.addReader(self.waker)
|
| -
|
| -
|
| - # IReactorProcess
|
| -
|
| - def spawnProcess(self, processProtocol, executable, args=(),
|
| - env={}, path=None,
|
| - uid=None, gid=None, usePTY=0, childFDs=None):
|
| - args, env = self._checkProcessArgs(args, env)
|
| - if platformType == 'posix':
|
| - if usePTY:
|
| - if childFDs is not None:
|
| - raise ValueError("Using childFDs is not supported with usePTY=True.")
|
| - return process.PTYProcess(self, executable, args, env, path,
|
| - processProtocol, uid, gid, usePTY)
|
| - else:
|
| - return process.Process(self, executable, args, env, path,
|
| - processProtocol, uid, gid, childFDs)
|
| - elif platformType == "win32":
|
| - if uid is not None or gid is not None:
|
| - raise ValueError("The uid and gid parameters are not supported on Windows.")
|
| - if usePTY:
|
| - raise ValueError("The usePTY parameter is not supported on Windows.")
|
| - if childFDs:
|
| - raise ValueError("Customizing childFDs is not supported on Windows.")
|
| -
|
| - if win32process:
|
| - from twisted.internet._dumbwin32proc import Process
|
| - return Process(self, processProtocol, executable, args, env, path)
|
| - else:
|
| - raise NotImplementedError, "spawnProcess not available since pywin32 is not installed."
|
| - else:
|
| - raise NotImplementedError, "spawnProcess only available on Windows or POSIX."
|
| -
|
| - # IReactorUDP
|
| -
|
| - def listenUDP(self, port, protocol, interface='', maxPacketSize=8192):
|
| - """Connects a given L{DatagramProtocol} to the given numeric UDP port.
|
| -
|
| - @returns: object conforming to L{IListeningPort}.
|
| - """
|
| - p = udp.Port(port, protocol, interface, maxPacketSize, self)
|
| - p.startListening()
|
| - return p
|
| -
|
| - def connectUDP(self, remotehost, remoteport, protocol, localport=0,
|
| - interface='', maxPacketSize=8192):
|
| - """DEPRECATED.
|
| -
|
| - Connects a L{ConnectedDatagramProtocol} instance to a UDP port.
|
| - """
|
| - warnings.warn("use listenUDP and then transport.connect().", DeprecationWarning, stacklevel=2)
|
| - p = udp.ConnectedPort((remotehost, remoteport), localport, protocol, interface, maxPacketSize, self)
|
| - p.startListening()
|
| - return p
|
| -
|
| -
|
| - # IReactorMulticast
|
| -
|
| - def listenMulticast(self, port, protocol, interface='', maxPacketSize=8192, listenMultiple=False):
|
| - """Connects a given DatagramProtocol to the given numeric UDP port.
|
| -
|
| - EXPERIMENTAL.
|
| -
|
| - @returns: object conforming to IListeningPort.
|
| - """
|
| - p = udp.MulticastPort(port, protocol, interface, maxPacketSize, self, listenMultiple)
|
| - p.startListening()
|
| - return p
|
| -
|
| -
|
| - # IReactorUNIX
|
| -
|
| - def connectUNIX(self, address, factory, timeout=30, checkPID=0):
|
| - """@see: twisted.internet.interfaces.IReactorUNIX.connectUNIX
|
| - """
|
| - assert unixEnabled, "UNIX support is not present"
|
| - c = unix.Connector(address, factory, timeout, self, checkPID)
|
| - c.connect()
|
| - return c
|
| -
|
| - def listenUNIX(self, address, factory, backlog=50, mode=0666, wantPID=0):
|
| - """@see: twisted.internet.interfaces.IReactorUNIX.listenUNIX
|
| - """
|
| - assert unixEnabled, "UNIX support is not present"
|
| - p = unix.Port(address, factory, backlog, mode, self, wantPID)
|
| - p.startListening()
|
| - return p
|
| -
|
| -
|
| - # IReactorUNIXDatagram
|
| -
|
| - def listenUNIXDatagram(self, address, protocol, maxPacketSize=8192, mode=0666):
|
| - """Connects a given L{DatagramProtocol} to the given path.
|
| -
|
| - EXPERIMENTAL.
|
| -
|
| - @returns: object conforming to L{IListeningPort}.
|
| - """
|
| - assert unixEnabled, "UNIX support is not present"
|
| - p = unix.DatagramPort(address, protocol, maxPacketSize, mode, self)
|
| - p.startListening()
|
| - return p
|
| -
|
| - def connectUNIXDatagram(self, address, protocol, maxPacketSize=8192, mode=0666, bindAddress=None):
|
| - """Connects a L{ConnectedDatagramProtocol} instance to a path.
|
| -
|
| - EXPERIMENTAL.
|
| - """
|
| - assert unixEnabled, "UNIX support is not present"
|
| - p = unix.ConnectedDatagramPort(address, protocol, maxPacketSize, mode, bindAddress, self)
|
| - p.startListening()
|
| - return p
|
| -
|
| -
|
| - # IReactorTCP
|
| -
|
| - def listenTCP(self, port, factory, backlog=50, interface=''):
|
| - """@see: twisted.internet.interfaces.IReactorTCP.listenTCP
|
| - """
|
| - p = tcp.Port(port, factory, backlog, interface, self)
|
| - p.startListening()
|
| - return p
|
| -
|
| - def connectTCP(self, host, port, factory, timeout=30, bindAddress=None):
|
| - """@see: twisted.internet.interfaces.IReactorTCP.connectTCP
|
| - """
|
| - c = tcp.Connector(host, port, factory, timeout, bindAddress, self)
|
| - c.connect()
|
| - return c
|
| -
|
| - # IReactorSSL (sometimes, not implemented)
|
| -
|
| - def connectSSL(self, host, port, factory, contextFactory, timeout=30, bindAddress=None):
|
| - """@see: twisted.internet.interfaces.IReactorSSL.connectSSL
|
| - """
|
| - assert sslEnabled, "SSL support is not present"
|
| - c = ssl.Connector(host, port, factory, contextFactory, timeout, bindAddress, self)
|
| - c.connect()
|
| - return c
|
| -
|
| - def listenSSL(self, port, factory, contextFactory, backlog=50, interface=''):
|
| - """@see: twisted.internet.interfaces.IReactorSSL.listenSSL
|
| - """
|
| - assert sslEnabled, "SSL support is not present"
|
| - p = ssl.Port(port, factory, contextFactory, backlog, interface, self)
|
| - p.startListening()
|
| - return p
|
| -
|
| - # IReactorArbitrary
|
| - def listenWith(self, portType, *args, **kw):
|
| - kw['reactor'] = self
|
| - p = portType(*args, **kw)
|
| - p.startListening()
|
| - return p
|
| -
|
| - def connectWith(self, connectorType, *args, **kw):
|
| - kw['reactor'] = self
|
| - c = connectorType(*args, **kw)
|
| - c.connect()
|
| - return c
|
| -
|
| - def _removeAll(self, readers, writers):
|
| - """
|
| - Remove all readers and writers, and return list of Selectables.
|
| -
|
| - Meant for calling from subclasses, to implement removeAll, like::
|
| -
|
| - def removeAll(self):
|
| - return self._removeAll(reads, writes)
|
| -
|
| - where C{reads} and C{writes} are iterables.
|
| - """
|
| - readers = [reader for reader in readers if
|
| - reader is not self.waker]
|
| -
|
| - readers_dict = {}
|
| - for reader in readers:
|
| - readers_dict[reader] = 1
|
| -
|
| - for reader in readers:
|
| - self.removeReader(reader)
|
| - self.removeWriter(reader)
|
| -
|
| - writers = [writer for writer in writers if
|
| - writer not in readers_dict]
|
| - for writer in writers:
|
| - self.removeWriter(writer)
|
| -
|
| - return readers+writers
|
| -
|
| -
|
| -if sslEnabled:
|
| - classImplements(PosixReactorBase, IReactorSSL)
|
| -if unixEnabled:
|
| - classImplements(PosixReactorBase, IReactorUNIX, IReactorUNIXDatagram)
|
| -if processEnabled:
|
| - classImplements(PosixReactorBase, IReactorProcess)
|
| -
|
| -__all__ = ["PosixReactorBase"]
|
|
|