twistedr compatibility; all twisted tests now pass.
This commit is contained in:
@@ -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__
|
||||||
|
|
||||||
|
|
||||||
|
@@ -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
|
||||||
|
Reference in New Issue
Block a user