From a8bd0a5d9c64a55f438c7a07c7c8bb9d16cae847 Mon Sep 17 00:00:00 2001 From: Ryan Williams Date: Mon, 31 Aug 2009 16:24:02 -0400 Subject: [PATCH] twistedr compatibility; all twisted tests now pass. --- eventlet/hubs/hub.py | 3 ++- eventlet/hubs/twistedr.py | 47 +++++++++++++++------------------------ 2 files changed, 20 insertions(+), 30 deletions(-) diff --git a/eventlet/hubs/hub.py b/eventlet/hubs/hub.py index bacfd69..bdc9b67 100644 --- a/eventlet/hubs/hub.py +++ b/eventlet/hubs/hub.py @@ -27,13 +27,14 @@ from eventlet.timer import Timer, LocalTimer class FdListener(object): def __init__(self, evtype, fileno, cb): + assert (evtype == 'read' or evtype == 'write') self.evtype = evtype self.fileno = fileno self.cb = cb def __call__(self, *args, **kw): return self.cb(*args, **kw) def __repr__(self): - return "FdListener(%r, %r, %r)" % (self.evtype, self.fileno, self.cb) + return "%s(%r, %r, %r)" % (type(self).__name__, self._evtype, self._fileno, self._cb) __str__ = __repr__ diff --git a/eventlet/hubs/twistedr.py b/eventlet/hubs/twistedr.py index f2ed2a5..a2ea2e4 100644 --- a/eventlet/hubs/twistedr.py +++ b/eventlet/hubs/twistedr.py @@ -23,6 +23,7 @@ import sys import threading from twisted.internet.base import DelayedCall as TwistedDelayedCall from eventlet import api +from eventlet.hubs import hub class DelayedCall(TwistedDelayedCall): @@ -62,31 +63,29 @@ def callLater(DelayedCallClass, reactor, _seconds, _f, *args, **kw): reactor._newTimedCalls.append(tple) return tple -class socket_rwdescriptor: +class socket_rwdescriptor(hub.FdListener): #implements(IReadWriteDescriptor) + def __init__(self, evtype, fileno, cb): + super(socket_rwdescriptor, self).__init__(evtype, fileno, cb) + # Twisted expects fileno to be a callable, not an attribute + self.fileno = lambda: fileno # required by glib2reactor disconnected = False - def __init__(self, fileno, read, write, error): - self._fileno = fileno - self.read = read - self.write = write - self.error = error - def doRead(self): - if self.read: - self.read(self) + if self.evtype == 'read': + self.cb(self) def doWrite(self): - if self.write: - self.write(self) + if self.evtype == 'write': + self.cb(self) def connectionLost(self, reason): self.disconnected = True - if self.error: - self.error(self, reason) - # trampoline() will now throw() into the greenlet that owns the socket + if self.cb: + self.cb(reason) + # trampoline() will now switch into the greenlet that owns the socket # leaving the mainloop unscheduled. However, when the next switch # to the mainloop occurs, twisted will not re-evaluate the delayed calls # because it assumes that none were scheduled since no client code was executed @@ -95,9 +94,6 @@ class socket_rwdescriptor: # times out. see test__hub.TestCloseSocketWhilePolling raise api.GreenletExit - def fileno(self): - return self._fileno - logstr = "twistedr" def logPrefix(self): @@ -131,25 +127,20 @@ class BaseTwistedHub(object): from twisted.internet import reactor reactor.stop() - def add_descriptor(self, fileno, read=None, write=None, exc=None): + def add(self, evtype, fileno, cb): from twisted.internet import reactor - descriptor = socket_rwdescriptor(fileno, read, write, exc) - if read: + descriptor = socket_rwdescriptor(evtype, fileno, cb) + if evtype == 'read': reactor.addReader(descriptor) - if write: + if evtype == 'write': reactor.addWriter(descriptor) - # XXX exc will not work if no read nor write return descriptor - def remove_descriptor(self, descriptor): + def remove(self, descriptor): from twisted.internet import reactor reactor.removeReader(descriptor) reactor.removeWriter(descriptor) - # required by GreenSocket - def exc_descriptor(self, _fileno): - pass # XXX do something sensible here - def schedule_call_local(self, seconds, func, *args, **kwargs): from twisted.internet import reactor def call_if_greenlet_alive(*args1, **kwargs1): @@ -186,8 +177,6 @@ class BaseTwistedHub(object): from twisted.internet import reactor return reactor.getWriters() - def get_excs(self): - return [] def get_timers_count(self): from twisted.internet import reactor