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):