from twisted.internet import defer, base, main
from twisted.internet.interfaces import IReactorTCP, IReactorUDP, IReactorArbitrary
from twisted.python import threadable, log
import tcp, udp
from _iocp import iocpcore
class Proactor(iocpcore, base.ReactorBase):
# TODO: IReactorArbitrary, IReactorUDP, IReactorMulticast,
# IReactorSSL (or leave it until exarkun finishes TLS)
# IReactorProcess, IReactorCore (cleanup)
__implements__ = base.ReactorBase.__implements__ + (IReactorTCP, IReactorUDP, IReactorArbitrary)
handles = None
iocp = None
def __init__(self):
iocpcore.__init__(self)
base.ReactorBase.__init__(self)
# self.completables = {}
def startRunning(self):
threadable.registerAsIOThread()
self.fireSystemEvent('startup')
self.running = 1
def run(self):
self.startRunning()
self.mainLoop()
def mainLoop(self):
while self.running:
try:
while self.running:
# Advance simulation time in delayed event
# processors.
self.runUntilCurrent()
t2 = self.timeout()
t = self.running and t2
self.doIteration(t)
except KeyboardInterrupt:
self.stop()
except:
log.msg("Unexpected error in main loop.")
log.deferr()
else:
log.msg('Main loop terminated.')
def removeAll(self):
return []
def installWaker(self):
pass
def wakeUp(self):
def ignore(ret, bytes, arg):
pass
if not threadable.isInIOThread():
self.issuePostQueuedCompletionStatus(ignore, None)
def listenTCP(self, port, factory, backlog=5, interface=''):
p = tcp.Port((interface, port), factory, backlog)
p.startListening()
return p
def connectTCP(self, host, port, factory, timeout=30, bindAddress=None):
c = tcp.Connector((host, port), factory, timeout, bindAddress)
c.connect()
return c
def listenUDP(self, port, protocol, interface='', maxPacketSize=8192):
p = udp.Port((interface, port), protocol, maxPacketSize)
p.startListening()
return p
def connectUDPblah(self, remotehost, remoteport, protocol, localport=0,
interface='', maxPacketSize=8192):
p = udp.ConnectedPort((remotehost, remoteport), (interface, localport), protocol, maxPacketSize)
p.startListening()
return p
def listenWith(self, portType, *args, **kw):
p = portType(*args, **kw)
p.startListening()
return p
def connectWith(self, connectorType, *args, **kw):
c = connectorType(*args, **kw)
c.connect()
return c
def install():
from twisted.python import threadable
p = Proactor()
threadable.init()
main.installReactor(p)
syntax highlighted by Code2HTML, v. 0.9.1