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

View File

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

View File

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

View File

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

View File

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