[pypy-svn] r42408 - in pypy/dist/pypy/lib/distributed: . test
fijal at codespeak.net
fijal at codespeak.net
Sat Apr 28 20:44:32 CEST 2007
Author: fijal
Date: Sat Apr 28 20:44:31 2007
New Revision: 42408
Added:
pypy/dist/pypy/lib/distributed/test/test_socklayer.py
Modified:
pypy/dist/pypy/lib/distributed/socklayer.py
Log:
Some simple wrappers around a socket and a weird test, which
does not close the socket properly, need to be rethinked at some point
Modified: pypy/dist/pypy/lib/distributed/socklayer.py
==============================================================================
--- pypy/dist/pypy/lib/distributed/socklayer.py (original)
+++ pypy/dist/pypy/lib/distributed/socklayer.py Sat Apr 28 20:44:31 2007
@@ -19,6 +19,7 @@
self.buffer = ""
self.conn = conn
+class ReceiverWrapper(SocketWrapper):
def receive(self):
msg, self.buffer = decodemessage(self.buffer)
while msg is None:
@@ -31,28 +32,39 @@
trace("received %s" % msg[1])
return marshal.loads(msg[1])
+class SenderWrapper(SocketWrapper):
def send(self, data):
trace("sending %s" % (data,))
self.conn.sendall(message('c', marshal.dumps(data)))
trace("done")
-def socket_listener(address=('', 12122), socket=socket):
+def socket_listener(address, socket=socket):
s = socket(AF_INET, SOCK_STREAM)
s.bind(address)
s.listen(1)
print "Waiting for connection"
conn, addr = s.accept()
- sw = SocketWrapper(conn)
- return sw.send, sw.receive
+ return SenderWrapper(conn).send, ReceiverWrapper(conn).receive
+
+def socket_loop(address, to_export, socket=socket):
+ from distributed import RemoteProtocol, remote_loop
+ try:
+ send, receive = socket_listener(address, socket)
+ remote_loop(RemoteProtocol(send, receive, to_export))
+ except Finished:
+ pass
def socket_connecter(address, socket=socket):
s = socket(AF_INET, SOCK_STREAM)
print "Connecting %s" % (address,)
s.connect(address)
- sw = SocketWrapper(s)
- return sw.send, sw.receive
+ return SenderWrapper(s).send, ReceiverWrapper(s).receive
+
+def connect(address, socket=socket):
+ from distributed import RemoteProtocol
+ return RemoteProtocol(*socket_connecter(address, socket))
def spawn_remote_side(code, gw):
""" A very simple wrapper around greenexecnet to allow
Added: pypy/dist/pypy/lib/distributed/test/test_socklayer.py
==============================================================================
--- (empty file)
+++ pypy/dist/pypy/lib/distributed/test/test_socklayer.py Sat Apr 28 20:44:31 2007
@@ -0,0 +1,28 @@
+
+from pypy.conftest import gettestobjspace
+
+# XXX think how to close the socket
+
+class AppTestSocklayer:
+ def setup_class(cls):
+ cls.space = gettestobjspace(**{"objspace.std.withtproxy": True,
+ "usemodules":("_stackless","rsocket", "select")})
+
+ def test_socklayer(self):
+ class X:
+ z = 3
+
+ x = X()
+
+ from py.__.green.pipe.gsocket import GreenSocket
+ from distributed.socklayer import socket_loop, connect
+ from py.__.green.greensock2 import oneof, allof
+
+ def one():
+ socket_loop(('127.0.0.1', 21211), {'x':x}, socket=GreenSocket)
+
+ def two():
+ rp = connect(('127.0.0.1', 21211), GreenSocket)
+ assert rp.get_remote('x').z == 3
+
+ oneof(one, two)
More information about the Pypy-commit
mailing list