green.select: fix mark_as_closed() wrong number of args
https://github.com/eventlet/eventlet/pull/294
This commit is contained in:
parent
0fed9e52ed
commit
0fdb1154cb
|
@ -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:
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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()
|
Loading…
Reference in New Issue