diff --git a/eventlet/hubs/hub.py b/eventlet/hubs/hub.py index 2dcc2b1..7dd9ee9 100644 --- a/eventlet/hubs/hub.py +++ b/eventlet/hubs/hub.py @@ -114,11 +114,6 @@ class BaseHub(object): self.secondaries[READ].pop(fileno, None) self.secondaries[WRITE].pop(fileno, None) - def stop(self): - self.abort() - if self.greenlet is not greenlet.getcurrent(): - self.switch() - def switch(self): cur = greenlet.getcurrent() assert cur is not self.greenlet, 'Cannot switch to MAINLOOP from MAINLOOP' @@ -202,6 +197,7 @@ class BaseHub(object): if self.running: self.stopping = True if wait: + assert self.greenlet is not greenlet.getcurrent(), "Can't abort with wait from inside the hub's greenlet." # schedule an immediate timer just so the hub doesn't sleep self.schedule_call_global(0, lambda: None) # switch to it; when done the hub will switch back to its parent, diff --git a/eventlet/hubs/pyevent.py b/eventlet/hubs/pyevent.py index 5cee91f..b5b2c67 100644 --- a/eventlet/hubs/pyevent.py +++ b/eventlet/hubs/pyevent.py @@ -84,8 +84,11 @@ class Hub(BaseHub): else: self.squelch_timer_exception(None, sys.exc_info()) - def abort(self): + def abort(self, wait=True): self.schedule_call_global(0, self.greenlet.throw, greenlet.GreenletExit) + if wait: + assert self.greenlet is not greenlet.getcurrent(), "Can't abort with wait from inside the hub's greenlet." + self.switch() def _getrunning(self): return bool(self.greenlet) diff --git a/eventlet/websocket.py b/eventlet/websocket.py index 83071e2..2976d7e 100644 --- a/eventlet/websocket.py +++ b/eventlet/websocket.py @@ -3,7 +3,7 @@ import errno from eventlet import wsgi from eventlet import pools import eventlet -from eventlet.common import get_errno +from eventlet.support import get_errno from eventlet.green import socket #from pprint import pformat diff --git a/tests/hub_test.py b/tests/hub_test.py index 400f22f..831673c 100644 --- a/tests/hub_test.py +++ b/tests/hub_test.py @@ -1,4 +1,4 @@ -from tests import LimitedTestCase, main +from tests import LimitedTestCase, main, skip_with_pyevent import time import eventlet from eventlet import hubs @@ -8,7 +8,8 @@ DELAY = 0.001 def noop(): pass -class TestTimerCleanup(LimitedTestCase): +class TestTimerCleanup(LimitedTestCase): + @skip_with_pyevent def test_cancel_accumulated(self): hub = hubs.get_hub() stimers = hub.get_timers_count() @@ -24,7 +25,8 @@ class TestTimerCleanup(LimitedTestCase): # there should be fewer than 1000 new timers and canceled self.assert_less_than_equal(hub.get_timers_count(), stimers + 1000) self.assert_less_than_equal(hub.timers_canceled, 1000) - + + @skip_with_pyevent def test_cancel_proportion(self): # if fewer than half the pending timers are canceled, it should # not clean them out