twistedr compatibility; all twisted tests now pass.

This commit is contained in:
Ryan Williams
2009-08-31 16:24:02 -04:00
parent 7e7057fe6d
commit a8bd0a5d9c
2 changed files with 20 additions and 30 deletions

View File

@@ -27,13 +27,14 @@ from eventlet.timer import Timer, LocalTimer
class FdListener(object): class FdListener(object):
def __init__(self, evtype, fileno, cb): def __init__(self, evtype, fileno, cb):
assert (evtype == 'read' or evtype == 'write')
self.evtype = evtype self.evtype = evtype
self.fileno = fileno self.fileno = fileno
self.cb = cb self.cb = cb
def __call__(self, *args, **kw): def __call__(self, *args, **kw):
return self.cb(*args, **kw) return self.cb(*args, **kw)
def __repr__(self): 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__ __str__ = __repr__

View File

@@ -23,6 +23,7 @@ import sys
import threading import threading
from twisted.internet.base import DelayedCall as TwistedDelayedCall from twisted.internet.base import DelayedCall as TwistedDelayedCall
from eventlet import api from eventlet import api
from eventlet.hubs import hub
class DelayedCall(TwistedDelayedCall): class DelayedCall(TwistedDelayedCall):
@@ -62,31 +63,29 @@ def callLater(DelayedCallClass, reactor, _seconds, _f, *args, **kw):
reactor._newTimedCalls.append(tple) reactor._newTimedCalls.append(tple)
return tple return tple
class socket_rwdescriptor: class socket_rwdescriptor(hub.FdListener):
#implements(IReadWriteDescriptor) #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 # required by glib2reactor
disconnected = False disconnected = False
def __init__(self, fileno, read, write, error):
self._fileno = fileno
self.read = read
self.write = write
self.error = error
def doRead(self): def doRead(self):
if self.read: if self.evtype == 'read':
self.read(self) self.cb(self)
def doWrite(self): def doWrite(self):
if self.write: if self.evtype == 'write':
self.write(self) self.cb(self)
def connectionLost(self, reason): def connectionLost(self, reason):
self.disconnected = True self.disconnected = True
if self.error: if self.cb:
self.error(self, reason) self.cb(reason)
# trampoline() will now throw() into the greenlet that owns the socket # trampoline() will now switch into the greenlet that owns the socket
# leaving the mainloop unscheduled. However, when the next switch # leaving the mainloop unscheduled. However, when the next switch
# to the mainloop occurs, twisted will not re-evaluate the delayed calls # 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 # 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 # times out. see test__hub.TestCloseSocketWhilePolling
raise api.GreenletExit raise api.GreenletExit
def fileno(self):
return self._fileno
logstr = "twistedr" logstr = "twistedr"
def logPrefix(self): def logPrefix(self):
@@ -131,25 +127,20 @@ class BaseTwistedHub(object):
from twisted.internet import reactor from twisted.internet import reactor
reactor.stop() reactor.stop()
def add_descriptor(self, fileno, read=None, write=None, exc=None): def add(self, evtype, fileno, cb):
from twisted.internet import reactor from twisted.internet import reactor
descriptor = socket_rwdescriptor(fileno, read, write, exc) descriptor = socket_rwdescriptor(evtype, fileno, cb)
if read: if evtype == 'read':
reactor.addReader(descriptor) reactor.addReader(descriptor)
if write: if evtype == 'write':
reactor.addWriter(descriptor) reactor.addWriter(descriptor)
# XXX exc will not work if no read nor write
return descriptor return descriptor
def remove_descriptor(self, descriptor): def remove(self, descriptor):
from twisted.internet import reactor from twisted.internet import reactor
reactor.removeReader(descriptor) reactor.removeReader(descriptor)
reactor.removeWriter(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): def schedule_call_local(self, seconds, func, *args, **kwargs):
from twisted.internet import reactor from twisted.internet import reactor
def call_if_greenlet_alive(*args1, **kwargs1): def call_if_greenlet_alive(*args1, **kwargs1):
@@ -186,8 +177,6 @@ class BaseTwistedHub(object):
from twisted.internet import reactor from twisted.internet import reactor
return reactor.getWriters() return reactor.getWriters()
def get_excs(self):
return []
def get_timers_count(self): def get_timers_count(self):
from twisted.internet import reactor from twisted.internet import reactor