From 0179da8cf21277b70debbb17eb5b23f2a580a2e4 Mon Sep 17 00:00:00 2001 From: Ryan Williams Date: Wed, 17 Mar 2010 17:03:16 -0700 Subject: [PATCH] Added assertion in greenpool to prevent infinite waits. Thanks to rtyler for the horrifying idea. --- eventlet/greenpool.py | 3 +++ tests/greenpool_test.py | 5 +++++ 2 files changed, 8 insertions(+) diff --git a/eventlet/greenpool.py b/eventlet/greenpool.py index 4126a6c..4027ab8 100644 --- a/eventlet/greenpool.py +++ b/eventlet/greenpool.py @@ -110,6 +110,9 @@ class GreenPool(object): def waitall(self): """Waits until all greenthreads in the pool are finished working.""" + assert greenthread.getcurrent() not in self.coroutines_running, \ + "Calling waitall() from within one of the "\ + "GreenPool's greenthreads will never terminate." if self.running(): self.no_coros_running.wait() diff --git a/tests/greenpool_test.py b/tests/greenpool_test.py index a0a4171..ad12602 100644 --- a/tests/greenpool_test.py +++ b/tests/greenpool_test.py @@ -301,6 +301,11 @@ class GreenPool(tests.LimitedTestCase): def test_waitall_on_nothing(self): p = greenpool.GreenPool() p.waitall() + + def test_recursive_waitall(self): + p = greenpool.GreenPool() + gt = p.spawn(p.waitall) + self.assertRaises(AssertionError, gt.wait) class GreenPile(tests.LimitedTestCase):