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:
1
AUTHORS
1
AUTHORS
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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):
|
||||
|
||||
7
tests/stdlib/test_select.py
Normal file
7
tests/stdlib/test_select.py
Normal 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 *
|
||||
Reference in New Issue
Block a user