diff options
author | jaimefrites <hootrade@ya.ru> | 2016-09-26 21:02:57 +0300 |
---|---|---|
committer | Sergey Shepelev <temotor@gmail.com> | 2017-01-18 01:03:31 +0500 |
commit | 0fdb1154cb5fa9389034e987f91aaeb0263463fa (patch) | |
tree | aef350a7afc8f3752006001dd6247d1d2563026e | |
parent | 0fed9e52ed84f690cd20495375fc06203889f189 (diff) | |
download | eventlet-0fdb1154cb5fa9389034e987f91aaeb0263463fa.tar.gz |
green.select: fix mark_as_closed() wrong number of argsselect-294
https://github.com/eventlet/eventlet/pull/294
-rw-r--r-- | eventlet/green/select.py | 16 | ||||
-rw-r--r-- | eventlet/hubs/kqueue.py | 11 | ||||
-rw-r--r-- | tests/green_select_test.py | 25 |
3 files changed, 37 insertions, 15 deletions
diff --git a/eventlet/green/select.py b/eventlet/green/select.py index 60301d3..f177502 100644 --- a/eventlet/green/select.py +++ b/eventlet/green/select.py @@ -1,8 +1,8 @@ -__select = __import__('select') -error = __select.error -from eventlet.greenthread import getcurrent +import eventlet from eventlet.hubs import get_hub from eventlet.support import six +__select = eventlet.patcher.original('select') +error = __select.error __patched__ = ['select'] @@ -36,7 +36,7 @@ def select(read_list, write_list, error_list, timeout=None): raise TypeError("Expected number for timeout") hub = get_hub() timers = [] - current = getcurrent() + current = eventlet.getcurrent() assert hub.greenlet is not current, 'do not call blocking functions from the mainloop' ds = {} for r in read_list: @@ -56,10 +56,6 @@ def select(read_list, write_list, error_list, timeout=None): original = ds[get_fileno(d)]['write'] current.switch(([], [original], [])) - def on_error(d, _err=None): - original = ds[get_fileno(d)]['error'] - current.switch(([], [], [original])) - def on_timeout2(): current.switch(([], [], [])) @@ -77,9 +73,9 @@ def select(read_list, write_list, error_list, timeout=None): try: for k, v in six.iteritems(ds): if v.get('read'): - listeners.append(hub.add(hub.READ, k, on_read, on_error, lambda x: None)) + listeners.append(hub.add(hub.READ, k, on_read, current.throw, lambda: None)) if v.get('write'): - listeners.append(hub.add(hub.WRITE, k, on_write, on_error, lambda x: None)) + listeners.append(hub.add(hub.WRITE, k, on_write, current.throw, lambda: None)) try: return hub.switch() finally: diff --git a/eventlet/hubs/kqueue.py b/eventlet/hubs/kqueue.py index 9487a16..05a961b 100644 --- a/eventlet/hubs/kqueue.py +++ b/eventlet/hubs/kqueue.py @@ -1,12 +1,11 @@ import os import sys -from eventlet import patcher +from eventlet import patcher, support from eventlet.support import six select = patcher.original('select') time = patcher.original('time') sleep = time.sleep -from eventlet.support import clear_sys_exc_info from eventlet.hubs.hub import BaseHub, READ, WRITE, noop @@ -73,9 +72,11 @@ class Hub(BaseHub): evtype = listener.evtype fileno = listener.fileno if not self.listeners[evtype].get(fileno): - event = self._events[fileno].pop(evtype) + event = self._events[fileno].pop(evtype, None) + if event is None: + return try: - self._delete_events([event]) + self._delete_events((event,)) except OSError: pass @@ -111,4 +112,4 @@ class Hub(BaseHub): raise except: self.squelch_exception(fileno, sys.exc_info()) - clear_sys_exc_info() + support.clear_sys_exc_info() diff --git a/tests/green_select_test.py b/tests/green_select_test.py new file mode 100644 index 0000000..e3d6624 --- /dev/null +++ b/tests/green_select_test.py @@ -0,0 +1,25 @@ +import eventlet +from eventlet import hubs +from eventlet.green import select +import tests +original_socket = eventlet.patcher.original('socket') + + +def test_select_mark_file_as_reopened(): + # https://github.com/eventlet/eventlet/pull/294 + # Fix API inconsistency in select and Hub. + # mark_as_closed takes one argument, but called without arguments. + # on_error takes file descriptor, but called with an exception object. + s = original_socket.socket() + s.setblocking(0) + s.bind(('127.0.0.1', 0)) + s.listen(5) + + gt = eventlet.spawn(select.select, [s], [s], [s]) + eventlet.sleep(0.01) + + with eventlet.Timeout(0.5) as t: + with tests.assert_raises(hubs.IOClosed): + hubs.get_hub().mark_as_reopened(s.fileno()) + gt.wait() + t.cancel() |