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:
amajorek
2010-03-04 23:57:50 -05:00
parent bd73531415
commit 1b07b9d5e5
5 changed files with 28 additions and 23 deletions

View File

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

View File

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

View File

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

View File

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

View File

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