Index: third_party/twisted_8_1/twisted/internet/iocpreactor/reactor.py |
diff --git a/third_party/twisted_8_1/twisted/internet/iocpreactor/reactor.py b/third_party/twisted_8_1/twisted/internet/iocpreactor/reactor.py |
deleted file mode 100644 |
index 08c4a36b3d2da24e6d5c9b74fba7f48402d0f4d4..0000000000000000000000000000000000000000 |
--- a/third_party/twisted_8_1/twisted/internet/iocpreactor/reactor.py |
+++ /dev/null |
@@ -1,211 +0,0 @@ |
-# -*- test-case-name: twisted.internet.test.test_iocp -*- |
- |
-# Copyright (c) 2008 Twisted Matrix Laboratories. |
-# See LICENSE for details. |
- |
- |
-""" |
-Reactor that uses IO completion ports |
-""" |
- |
- |
-from twisted.internet import base, interfaces, main, error |
-from twisted.python import log, failure |
-from twisted.internet._dumbwin32proc import Process |
- |
-from zope.interface import implements |
-import socket, sys |
- |
-from twisted.internet.iocpreactor import iocpsupport as _iocp |
-from twisted.internet.iocpreactor.const import WAIT_TIMEOUT |
-from twisted.internet.iocpreactor import tcp, udp |
- |
-from twisted.python.compat import set |
- |
-MAX_TIMEOUT = 2000 # 2 seconds, see doIteration for explanation |
- |
-EVENTS_PER_LOOP = 1000 # XXX: what's a good value here? |
- |
-# keys to associate with normal and waker events |
-KEY_NORMAL, KEY_WAKEUP = range(2) |
- |
-_NO_GETHANDLE = error.ConnectionFdescWentAway( |
- 'Handler has no getFileHandle method') |
-_NO_FILEDESC = error.ConnectionFdescWentAway('Filedescriptor went away') |
- |
- |
- |
-class IOCPReactor(base._SignalReactorMixin, base.ReactorBase): |
- implements(interfaces.IReactorTCP, interfaces.IReactorUDP, |
- interfaces.IReactorMulticast, interfaces.IReactorProcess) |
- |
- port = None |
- |
- def __init__(self): |
- base.ReactorBase.__init__(self) |
- self.port = _iocp.CompletionPort() |
- self.handles = set() |
- |
- |
- def addActiveHandle(self, handle): |
- self.handles.add(handle) |
- |
- |
- def removeActiveHandle(self, handle): |
- self.handles.discard(handle) |
- |
- |
- def doIteration(self, timeout): |
- # This function sits and waits for an IO completion event. |
- # |
- # There are two requirements: process IO events as soon as they arrive |
- # and process ctrl-break from the user in a reasonable amount of time. |
- # |
- # There are three kinds of waiting. |
- # 1) GetQueuedCompletionStatus (self.port.getEvent) to wait for IO |
- # events only. |
- # 2) Msg* family of wait functions that can stop waiting when |
- # ctrl-break is detected (then, I think, Python converts it into a |
- # KeyboardInterrupt) |
- # 3) *Ex family of wait functions that put the thread into an |
- # "alertable" wait state which is supposedly triggered by IO completion |
- # |
- # 2) and 3) can be combined. Trouble is, my IO completion is not |
- # causing 3) to trigger, possibly because I do not use an IO completion |
- # callback. Windows is weird. |
- # There are two ways to handle this. I could use MsgWaitForSingleObject |
- # here and GetQueuedCompletionStatus in a thread. Or I could poll with |
- # a reasonable interval. Guess what! Threads are hard. |
- |
- processed_events = 0 |
- if timeout is None: |
- timeout = MAX_TIMEOUT |
- else: |
- timeout = min(MAX_TIMEOUT, int(1000*timeout)) |
- rc, bytes, key, evt = self.port.getEvent(timeout) |
- while processed_events < EVENTS_PER_LOOP: |
- if rc == WAIT_TIMEOUT: |
- break |
- if key != KEY_WAKEUP: |
- assert key == KEY_NORMAL |
- if not evt.ignore: |
- log.callWithLogger(evt.owner, self._callEventCallback, |
- rc, bytes, evt) |
- processed_events += 1 |
- rc, bytes, key, evt = self.port.getEvent(0) |
- |
- |
- def _callEventCallback(self, rc, bytes, evt): |
- owner = evt.owner |
- why = None |
- try: |
- evt.callback(rc, bytes, evt) |
- handfn = getattr(owner, 'getFileHandle', None) |
- if not handfn: |
- why = _NO_GETHANDLE |
- elif handfn() == -1: |
- why = _NO_FILEDESC |
- if why: |
- return # ignore handles that were closed |
- except: |
- why = sys.exc_info()[1] |
- log.err() |
- if why: |
- owner.loseConnection(failure.Failure(why)) |
- |
- |
- def installWaker(self): |
- pass |
- |
- |
- def wakeUp(self): |
- self.port.postEvent(0, KEY_WAKEUP, None) |
- |
- |
- def registerHandle(self, handle): |
- self.port.addHandle(handle, KEY_NORMAL) |
- |
- |
- def createSocket(self, af, stype): |
- skt = socket.socket(af, stype) |
- self.registerHandle(skt.fileno()) |
- return skt |
- |
- |
- 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 |
- |
- |
- 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 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 |
- |
- |
- def spawnProcess(self, processProtocol, executable, args=(), env={}, |
- path=None, uid=None, gid=None, usePTY=0, childFDs=None): |
- """ |
- Spawn a process. |
- """ |
- if uid is not None: |
- raise ValueError("Setting UID is unsupported on this platform.") |
- if gid is not None: |
- raise ValueError("Setting GID is unsupported on this platform.") |
- if usePTY: |
- raise ValueError("PTYs are unsupported on this platform.") |
- if childFDs is not None: |
- raise ValueError( |
- "Custom child file descriptor mappings are unsupported on " |
- "this platform.") |
- args, env = self._checkProcessArgs(args, env) |
- return Process(self, processProtocol, executable, args, env, path) |
- |
- |
- def removeAll(self): |
- res = list(self.handles) |
- self.handles.clear() |
- return res |
- |
- |
- |
-def install(): |
- r = IOCPReactor() |
- main.installReactor(r) |
- |
- |
-__all__ = ['IOCPReactor', 'install'] |
- |