green.select: fix mark_as_closed() wrong number of args
https://github.com/eventlet/eventlet/pull/294
This commit is contained in:
committed by
Sergey Shepelev
parent
0fed9e52ed
commit
0fdb1154cb
@@ -1,8 +1,8 @@
|
|||||||
__select = __import__('select')
|
import eventlet
|
||||||
error = __select.error
|
|
||||||
from eventlet.greenthread import getcurrent
|
|
||||||
from eventlet.hubs import get_hub
|
from eventlet.hubs import get_hub
|
||||||
from eventlet.support import six
|
from eventlet.support import six
|
||||||
|
__select = eventlet.patcher.original('select')
|
||||||
|
error = __select.error
|
||||||
|
|
||||||
|
|
||||||
__patched__ = ['select']
|
__patched__ = ['select']
|
||||||
@@ -36,7 +36,7 @@ def select(read_list, write_list, error_list, timeout=None):
|
|||||||
raise TypeError("Expected number for timeout")
|
raise TypeError("Expected number for timeout")
|
||||||
hub = get_hub()
|
hub = get_hub()
|
||||||
timers = []
|
timers = []
|
||||||
current = getcurrent()
|
current = eventlet.getcurrent()
|
||||||
assert hub.greenlet is not current, 'do not call blocking functions from the mainloop'
|
assert hub.greenlet is not current, 'do not call blocking functions from the mainloop'
|
||||||
ds = {}
|
ds = {}
|
||||||
for r in read_list:
|
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']
|
original = ds[get_fileno(d)]['write']
|
||||||
current.switch(([], [original], []))
|
current.switch(([], [original], []))
|
||||||
|
|
||||||
def on_error(d, _err=None):
|
|
||||||
original = ds[get_fileno(d)]['error']
|
|
||||||
current.switch(([], [], [original]))
|
|
||||||
|
|
||||||
def on_timeout2():
|
def on_timeout2():
|
||||||
current.switch(([], [], []))
|
current.switch(([], [], []))
|
||||||
|
|
||||||
@@ -77,9 +73,9 @@ def select(read_list, write_list, error_list, timeout=None):
|
|||||||
try:
|
try:
|
||||||
for k, v in six.iteritems(ds):
|
for k, v in six.iteritems(ds):
|
||||||
if v.get('read'):
|
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'):
|
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:
|
try:
|
||||||
return hub.switch()
|
return hub.switch()
|
||||||
finally:
|
finally:
|
||||||
|
|||||||
@@ -1,12 +1,11 @@
|
|||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
from eventlet import patcher
|
from eventlet import patcher, support
|
||||||
from eventlet.support import six
|
from eventlet.support import six
|
||||||
select = patcher.original('select')
|
select = patcher.original('select')
|
||||||
time = patcher.original('time')
|
time = patcher.original('time')
|
||||||
sleep = time.sleep
|
sleep = time.sleep
|
||||||
|
|
||||||
from eventlet.support import clear_sys_exc_info
|
|
||||||
from eventlet.hubs.hub import BaseHub, READ, WRITE, noop
|
from eventlet.hubs.hub import BaseHub, READ, WRITE, noop
|
||||||
|
|
||||||
|
|
||||||
@@ -73,9 +72,11 @@ class Hub(BaseHub):
|
|||||||
evtype = listener.evtype
|
evtype = listener.evtype
|
||||||
fileno = listener.fileno
|
fileno = listener.fileno
|
||||||
if not self.listeners[evtype].get(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:
|
try:
|
||||||
self._delete_events([event])
|
self._delete_events((event,))
|
||||||
except OSError:
|
except OSError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@@ -111,4 +112,4 @@ class Hub(BaseHub):
|
|||||||
raise
|
raise
|
||||||
except:
|
except:
|
||||||
self.squelch_exception(fileno, sys.exc_info())
|
self.squelch_exception(fileno, sys.exc_info())
|
||||||
clear_sys_exc_info()
|
support.clear_sys_exc_info()
|
||||||
|
|||||||
25
tests/green_select_test.py
Normal file
25
tests/green_select_test.py
Normal 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()
|
||||||
Reference in New Issue
Block a user