Fixes #74, removing filenos from the hub when they raise a value error, thanks to Edward George for the repro and fix.

This commit is contained in:
Ryan Williams
2011-01-23 17:31:43 -08:00
parent a743592a6a
commit ba6960d141
3 changed files with 29 additions and 14 deletions

View File

@@ -67,3 +67,4 @@ Thanks To
* Malcolm Cleaton, patch for Event exception handling * Malcolm Cleaton, patch for Event exception handling
* Alexey Borzenkov, for finding and fixing issues with Windows error detection (#66, #69), reducing dependencies in zeromq hub (#71) * Alexey Borzenkov, for finding and fixing issues with Windows error detection (#66, #69), reducing dependencies in zeromq hub (#71)
* Anonymous, finding and fixing error in websocket chat example (#70) * Anonymous, finding and fixing error in websocket chat example (#70)
* Edward George, finding and fixing an issue in the [e]poll hubs (#74)

View File

@@ -38,21 +38,26 @@ class Hub(BaseHub):
mask |= READ_MASK | EXC_MASK mask |= READ_MASK | EXC_MASK
if self.listeners[WRITE].get(fileno): if self.listeners[WRITE].get(fileno):
mask |= WRITE_MASK | EXC_MASK mask |= WRITE_MASK | EXC_MASK
if mask: try:
if new: if mask:
self.poll.register(fileno, mask) if new:
self.poll.register(fileno, mask)
else:
try:
self.modify(fileno, mask)
except (IOError, OSError):
self.poll.register(fileno, mask)
else: else:
try: try:
self.modify(fileno, mask) self.poll.unregister(fileno)
except (IOError, OSError): except (KeyError, IOError, OSError):
self.poll.register(fileno, mask) # raised if we try to remove a fileno that was
else: # already removed/invalid
try: pass
self.poll.unregister(fileno) except ValueError:
except (KeyError, IOError, OSError): # fileno is bad, issue 74
# raised if we try to remove a fileno that was self.remove_descriptor(fileno)
# already removed/invalid raise
pass
def remove_descriptor(self, fileno): def remove_descriptor(self, fileno):
super(Hub, self).remove_descriptor(fileno) super(Hub, self).remove_descriptor(fileno)

View File

@@ -169,6 +169,7 @@ class TestHubBlockingDetector(LimitedTestCase):
self.assertRaises(RuntimeError, gt.wait) self.assertRaises(RuntimeError, gt.wait)
debug.hub_blocking_detection(False) debug.hub_blocking_detection(False)
class TestSuspend(LimitedTestCase): class TestSuspend(LimitedTestCase):
TEST_TIMEOUT=3 TEST_TIMEOUT=3
def test_suspend_doesnt_crash(self): def test_suspend_doesnt_crash(self):
@@ -205,6 +206,14 @@ except eventlet.Timeout:
shutil.rmtree(self.tempdir) shutil.rmtree(self.tempdir)
class TestBadFilenos(LimitedTestCase):
@skip_with_pyevent
def test_repeated_selects(self):
from eventlet.green import select
self.assertRaises(ValueError, select.select, [-1], [], [])
self.assertRaises(ValueError, select.select, [-1], [], [])
class Foo(object): class Foo(object):
pass pass