summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjaimefrites <hootrade@ya.ru>2016-09-26 21:02:57 +0300
committerSergey Shepelev <temotor@gmail.com>2017-01-18 01:03:31 +0500
commit0fdb1154cb5fa9389034e987f91aaeb0263463fa (patch)
treeaef350a7afc8f3752006001dd6247d1d2563026e
parent0fed9e52ed84f690cd20495375fc06203889f189 (diff)
downloadeventlet-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.py16
-rw-r--r--eventlet/hubs/kqueue.py11
-rw-r--r--tests/green_select_test.py25
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()