Fix for twistedhub incompatibility. Added the stdlib select test, which uncovered a few more minor issues. Thanks to Luci Stanescu for the bug report.

This commit is contained in:
Ryan Williams
2009-10-30 14:23:57 -07:00
parent ff512ff1c2
commit 513e3eb5a3
5 changed files with 26 additions and 11 deletions

View File

@@ -23,6 +23,7 @@ Linden Lab Contributors
Thanks To
---------
* Luci Stanescu, for reporting twisted hub bug
* Marcus Cavanaugh, for test case code that has been incredibly useful in tracking down bugs
* Brian Brunswick, for many helpful questions and suggestions on the mailing list
* Cesar Alaniz, for uncovering bugs of great import

View File

@@ -140,7 +140,8 @@ def get_fileno(obj):
try:
f = obj.fileno
except AttributeError:
assert isinstance(obj, (int, long))
if not isinstance(obj, (int, long)):
raise TypeError("Expected int or long, got " + type(obj))
return obj
else:
return f()
@@ -158,7 +159,7 @@ def select(read_list, write_list, error_list, timeout=None):
for e in error_list:
ds.setdefault(get_fileno(e), {})['error'] = e
descriptors = []
listeners = []
def on_read(d):
original = ds[get_fileno(d)]['read']
@@ -180,15 +181,14 @@ def select(read_list, write_list, error_list, timeout=None):
try:
for k, v in ds.iteritems():
if v.get('read'):
hub.add(hub.READ, k, on_read)
listeners.append(hub.add(hub.READ, k, on_read))
if v.get('write'):
hub.add(hub.WRITE, k, on_write)
descriptors.append(k)
listeners.append(hub.add(hub.WRITE, k, on_write))
try:
return hub.switch()
finally:
for d in descriptors:
hub.remove_descriptor(d)
for l in listeners:
hub.remove(l)
finally:
if t is not None:
t.cancel()

View File

@@ -92,7 +92,8 @@ class BaseHub(object):
self.closed_fds.append(fileno)
def remove_descriptor(self, fileno):
""" Completely remove all listeners for this fileno."""
""" Completely remove all listeners for this fileno. For internal use
only."""
self.listeners[READ].pop(fileno, None)
self.listeners[WRITE].pop(fileno, None)

View File

@@ -33,6 +33,8 @@ class LocalDelayedCall(DelayedCall):
def callLater(DelayedCallClass, reactor, _seconds, _f, *args, **kw):
# the same as original but creates fixed DelayedCall instance
assert callable(_f), "%s is not callable" % _f
if not isinstance(_seconds, (int, long, float)):
raise TypeError("Seconds must be int, long, or float, was " + type(_seconds))
assert sys.maxint >= _seconds >= 0, \
"%s is not greater than or equal to 0 seconds" % (_seconds,)
tple = DelayedCallClass(reactor.seconds() + _seconds, _f, args, kw,
@@ -46,8 +48,12 @@ class socket_rwdescriptor(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
if not isinstance(fileno, (int,long)):
raise TypeError("Expected int or long, got %s" % type(fileno))
# Twisted expects fileno to be a callable, not an attribute
def _fileno():
return fileno
self.fileno = _fileno
# required by glib2reactor
disconnected = False
@@ -122,7 +128,7 @@ class BaseTwistedHub(object):
from twisted.internet import reactor
reactor.removeReader(descriptor)
reactor.removeWriter(descriptor)
def schedule_call_local(self, seconds, func, *args, **kwargs):
from twisted.internet import reactor
def call_if_greenlet_alive(*args1, **kwargs1):

View File

@@ -0,0 +1,7 @@
from eventlet import api
api.sleep(0) # initialize the hub
from eventlet.green import select
import sys
sys.modules['select'] = select
from test.test_select import *