diff --git a/eventlet/api_test.py b/eventlet/api_test.py index 8680396..73a9d50 100644 --- a/eventlet/api_test.py +++ b/eventlet/api_test.py @@ -32,8 +32,9 @@ def check_hub(): api.sleep(0) api.sleep(0) hub = api.get_hub() - for dct in hub.readers, hub.writers, hub.excs: - assert not dct, repr(dct) + for nm in 'readers', 'writers', 'excs': + dct = getattr(hub, nm) + assert not dct, "hub.%s not empty: %s" % (nm, dct) # Stop the runloop api.get_hub().abort() api.sleep(0) @@ -74,12 +75,11 @@ class TestApi(tests.TestCase): check_hub() def test_server(self): + connected = [] server = api.tcp_listener(('0.0.0.0', 0)) bound_port = server.getsockname()[1] - connected = [] def accept_twice((conn, addr)): - print 'connected' connected.append(True) conn.close() if len(connected) == 2: diff --git a/eventlet/hub.py b/eventlet/hub.py index 5000691..9273ee6 100644 --- a/eventlet/hub.py +++ b/eventlet/hub.py @@ -33,7 +33,7 @@ import greenlet from eventlet import greenlib from eventlet.timer import Timer -class Hub(object): +class BaseHub(object): SYSTEM_EXCEPTIONS = (KeyboardInterrupt, SystemExit) def __init__(self, clock=time.time): diff --git a/eventlet/libeventhub.py b/eventlet/libeventhub.py index c4c5b5f..d05a19a 100644 --- a/eventlet/libeventhub.py +++ b/eventlet/libeventhub.py @@ -34,6 +34,9 @@ from eventlet import hub import greenlet +# XXX for debugging only +#raise ImportError() + try: # use rel if it's available import rel @@ -45,7 +48,7 @@ except ImportError: import event -class Hub(hub.Hub): +class Hub(hub.BaseHub): SYSTEM_EXCEPTIONS = (KeyboardInterrupt, SystemExit) def __init__(self, clock=time.time): @@ -68,36 +71,33 @@ class Hub(hub.Hub): evt = event.write(fileno, write, fileno) evt.add() self.writers[fileno] = evt, write + + if exc: + self.excs[fileno] = exc def remove_descriptor(self, fileno): for queue in (self.readers, self.writers): tpl = queue.pop(fileno, None) if tpl is not None: tpl[0].delete() - - def exc_descriptor(self, fileno): - for queue in (self.readers, self.writers): - tpl = queue.pop(fileno, None) - if tpl is not None: - evt, cb = tpl - evt.delete() - cb(fileno) + self.excs.pop(fileno, None) def signal_received(self, signal): self.interrupted = True def wait(self, seconds=None): - if self.interrupted: - raise KeyboardInterrupt() - timer = event.timeout(seconds, lambda: None) timer.add() status = event.loop() if status == -1: raise RuntimeError("does this ever happen?") - + timer.delete() + + if self.interrupted: + self.interrupted = False + raise KeyboardInterrupt() def add_timer(self, timer): event.timeout(timer.seconds, timer).add() diff --git a/eventlet/pollhub.py b/eventlet/pollhub.py index 17755df..790dd3b 100644 --- a/eventlet/pollhub.py +++ b/eventlet/pollhub.py @@ -37,7 +37,7 @@ EXC_MASK = select.POLLERR | select.POLLHUP | select.POLLNVAL READ_MASK = select.POLLIN WRITE_MASK = select.POLLOUT -class Hub(hub.Hub): +class Hub(hub.BaseHub): def __init__(self, clock=time.time): super(Hub, self).__init__(clock) self.poll = select.poll() diff --git a/eventlet/selecthub.py b/eventlet/selecthub.py index 41fd58f..798afbb 100644 --- a/eventlet/selecthub.py +++ b/eventlet/selecthub.py @@ -31,7 +31,7 @@ from eventlet import hub import greenlet -class Hub(hub.Hub): +class Hub(hub.BaseHub): def wait(self, seconds=None): readers = self.readers writers = self.writers