py3k - more changes.
- sys.exc_clear does not exist in 3.x - objects are not comparable by default in in 3.x. Timer needs to have __lt__ operator to be used by heapq. - callable is gone in 3.x. - tpool communication pipe changed to exchange binary data. It makes current GreenPipe work in 3.x. It is also faster and have less translation layers. - 3.x socket uses bytes not str class. Used s2b to make tests working on both.
This commit is contained in:
@@ -5,7 +5,7 @@ select = patcher.original('select')
|
||||
time = patcher.original('time')
|
||||
sleep = time.sleep
|
||||
|
||||
from eventlet.common import get_errno
|
||||
from eventlet.common import get_errno, clear_sys_exc_info
|
||||
from eventlet.hubs.hub import BaseHub, READ, WRITE
|
||||
|
||||
EXC_MASK = select.POLLERR | select.POLLHUP
|
||||
@@ -109,4 +109,4 @@ class Hub(BaseHub):
|
||||
raise
|
||||
except:
|
||||
self.squelch_exception(fileno, sys.exc_info())
|
||||
sys.exc_clear()
|
||||
clear_sys_exc_info()
|
||||
|
@@ -75,6 +75,11 @@ class Timer(object):
|
||||
except AttributeError:
|
||||
pass
|
||||
|
||||
# No default ordering in 3.x. heapq uses <
|
||||
# FIXME should full set be added?
|
||||
def __lt__(self, other):
|
||||
return id(self)<id(other)
|
||||
|
||||
class LocalTimer(Timer):
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
|
@@ -389,7 +389,7 @@ class Source(object):
|
||||
return LinkToGreenlet(listener)
|
||||
if hasattr(listener, 'send'):
|
||||
return LinkToEvent(listener)
|
||||
elif callable(listener):
|
||||
elif hasattr(listener, '__call__'):
|
||||
return LinkToCallable(listener)
|
||||
else:
|
||||
raise TypeError("Don't know how to link to %r" % (listener, ))
|
||||
|
@@ -30,8 +30,10 @@ QUIET=True
|
||||
|
||||
_rfile = _wfile = None
|
||||
|
||||
_bytetosend = ' '.encode()
|
||||
|
||||
def _signal_t2e():
|
||||
_wfile.write(' ')
|
||||
_wfile.write(_bytetosend)
|
||||
_wfile.flush()
|
||||
|
||||
_reqq = None
|
||||
@@ -42,7 +44,7 @@ def tpool_trampoline():
|
||||
while(True):
|
||||
try:
|
||||
_c = _rfile.read(1)
|
||||
assert _c != ""
|
||||
assert _c
|
||||
except ValueError:
|
||||
break # will be raised when pipe is closed
|
||||
while not _rspq.empty():
|
||||
@@ -218,8 +220,8 @@ def setup():
|
||||
_setup_already = True
|
||||
try:
|
||||
_rpipe, _wpipe = os.pipe()
|
||||
_wfile = os.fdopen(_wpipe,"w",0)
|
||||
_rfile = os.fdopen(_rpipe,"r",0)
|
||||
_wfile = os.fdopen(_wpipe,"wb",0)
|
||||
_rfile = os.fdopen(_rpipe,"rb",0)
|
||||
## Work whether or not wrap_pipe_with_coroutine_pipe was called
|
||||
if not isinstance(_rfile, greenio.GreenPipe):
|
||||
_rfile = greenio.GreenPipe(_rfile)
|
||||
@@ -234,8 +236,8 @@ def setup():
|
||||
csock = util.__original_socket__(socket.AF_INET, socket.SOCK_STREAM)
|
||||
csock.connect(('localhost', sock.getsockname()[1]))
|
||||
nsock, addr = sock.accept()
|
||||
_rfile = greenio.GreenSocket(csock).makefile()
|
||||
_wfile = nsock.makefile('w')
|
||||
_rfile = greenio.GreenSocket(csock).makefile('rb', 0)
|
||||
_wfile = nsock.makefile('wb',0)
|
||||
|
||||
_reqq = Queue(maxsize=-1)
|
||||
_rspq = Queue(maxsize=-1)
|
||||
|
@@ -1,6 +1,6 @@
|
||||
import eventlet
|
||||
from eventlet import event
|
||||
from tests import LimitedTestCase
|
||||
from tests import LimitedTestCase, s2b
|
||||
|
||||
class TestServe(LimitedTestCase):
|
||||
def setUp(self):
|
||||
@@ -21,37 +21,37 @@ class TestServe(LimitedTestCase):
|
||||
l = eventlet.listen(('localhost', 0))
|
||||
gt = eventlet.spawn(eventlet.serve, l, closer)
|
||||
client = eventlet.connect(('localhost', l.getsockname()[1]))
|
||||
client.sendall('a')
|
||||
self.assertEqual('', client.recv(100))
|
||||
client.sendall(s2b('a'))
|
||||
self.assertFalse(client.recv(100))
|
||||
gt.kill()
|
||||
|
||||
|
||||
def test_excepting_server(self):
|
||||
# tests that the server closes the client sock on handle() exception
|
||||
def crasher(sock,addr):
|
||||
x = sock.recv(1024)
|
||||
sock.recv(1024)
|
||||
0/0
|
||||
|
||||
l = eventlet.listen(('localhost', 0))
|
||||
gt = eventlet.spawn(eventlet.serve, l, crasher)
|
||||
client = eventlet.connect(('localhost', l.getsockname()[1]))
|
||||
client.sendall('a')
|
||||
client.sendall(s2b('a'))
|
||||
self.assertRaises(ZeroDivisionError, gt.wait)
|
||||
self.assertEqual('', client.recv(100))
|
||||
self.assertFalse(client.recv(100))
|
||||
|
||||
def test_excepting_server_already_closed(self):
|
||||
# same as above but with explicit clsoe before crash
|
||||
def crasher(sock,addr):
|
||||
x = sock.recv(1024)
|
||||
sock.recv(1024)
|
||||
sock.close()
|
||||
0/0
|
||||
|
||||
l = eventlet.listen(('localhost', 0))
|
||||
gt = eventlet.spawn(eventlet.serve, l, crasher)
|
||||
client = eventlet.connect(('localhost', l.getsockname()[1]))
|
||||
client.sendall('a')
|
||||
client.sendall(s2b('a'))
|
||||
self.assertRaises(ZeroDivisionError, gt.wait)
|
||||
self.assertEqual('', client.recv(100))
|
||||
self.assertFalse(client.recv(100))
|
||||
|
||||
def test_called_for_each_connection(self):
|
||||
hits = [0]
|
||||
@@ -61,7 +61,7 @@ class TestServe(LimitedTestCase):
|
||||
gt = eventlet.spawn(eventlet.serve, l, counter)
|
||||
for i in xrange(100):
|
||||
client = eventlet.connect(('localhost', l.getsockname()[1]))
|
||||
self.assertEqual('', client.recv(100))
|
||||
self.assertFalse(client.recv(100))
|
||||
gt.kill()
|
||||
self.assertEqual(100, hits[0])
|
||||
|
||||
@@ -85,14 +85,14 @@ class TestServe(LimitedTestCase):
|
||||
def test_concurrency(self):
|
||||
evt = event.Event()
|
||||
def waiter(sock, addr):
|
||||
sock.sendall('hi')
|
||||
sock.sendall(s2b('hi'))
|
||||
evt.wait()
|
||||
l = eventlet.listen(('localhost', 0))
|
||||
gt = eventlet.spawn(eventlet.serve, l, waiter, 5)
|
||||
def test_client():
|
||||
c = eventlet.connect(('localhost', l.getsockname()[1]))
|
||||
# verify the client is connected by getting data
|
||||
self.assertEquals('hi', c.recv(2))
|
||||
self.assertEquals(s2b('hi'), c.recv(2))
|
||||
return c
|
||||
clients = [test_client() for i in xrange(5)]
|
||||
# very next client should not get anything
|
||||
@@ -101,5 +101,3 @@ class TestServe(LimitedTestCase):
|
||||
timeout_value="timed out")
|
||||
self.assertEquals(x, "timed out")
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user