green.select: fix mark_as_closed() wrong number of args

https://github.com/eventlet/eventlet/pull/294
This commit is contained in:
jaimefrites 2016-09-26 21:02:57 +03:00 committed by Sergey Shepelev
parent 0fed9e52ed
commit 0fdb1154cb
3 changed files with 37 additions and 15 deletions

View File

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

View File

@ -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()

View File

@ -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()