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