Patch and test from Malcolm Cleaton for Event objects.

This commit is contained in:
Ryan Williams
2010-10-27 09:56:31 -07:00
parent e374a8d741
commit 294b9bc337
3 changed files with 18 additions and 10 deletions

View File

@@ -64,3 +64,4 @@ Thanks To
* Slide, for open-sourcing gogreen
* Holger Krekel, websocket example small fix
* mikepk, debugging MySQLdb/tpool issues
* Malcolm Cleaton, patch for Event exception handling

View File

@@ -153,18 +153,16 @@ class Event(object):
exc = (exc, )
self._exc = exc
hub = hubs.get_hub()
if self._waiters:
for waiter in self._waiters:
hub.schedule_call_global(
0, self._do_send, self._result, self._exc, self._waiters.copy())
0, self._do_send, self._result, self._exc, waiter)
def _do_send(self, result, exc, waiters):
while waiters:
waiter = waiters.pop()
if waiter in self._waiters:
if exc is None:
waiter.switch(result)
else:
waiter.throw(*exc)
def _do_send(self, result, exc, waiter):
if waiter in self._waiters:
if exc is None:
waiter.switch(result)
else:
waiter.throw(*exc)
def send_exception(self, *args):
"""Same as :meth:`send`, but sends an exception to waiters.

View File

@@ -12,6 +12,12 @@ class TestEvent(LimitedTestCase):
self.assertEqual(evt.wait(), value)
def test_multiple_waiters(self):
self._test_multiple_waiters(False)
def test_multiple_waiters_with_exception(self):
self._test_multiple_waiters(True)
def _test_multiple_waiters(self, exception):
evt = event.Event()
value = 'some stuff'
results = []
@@ -19,12 +25,15 @@ class TestEvent(LimitedTestCase):
evt.wait()
results.append(True)
i_am_done.send()
if exception:
raise Exception()
waiters = []
count = 5
for i in range(count):
waiters.append(event.Event())
eventlet.spawn_n(wait_on_event, waiters[-1])
eventlet.sleep() # allow spawns to start executing
evt.send()
for w in waiters: