[shpy-commit] r2825 - in shpy/trunk/dist/shpy/net: . test

arigo@codespeak.net arigo@codespeak.net
Sun, 18 Jan 2004 20:25:57 +0100 (MET)


Author: arigo
Date: Sun Jan 18 20:25:56 2004
New Revision: 2825

Modified:
   shpy/trunk/dist/shpy/net/gateway.py
   shpy/trunk/dist/shpy/net/register.py
   shpy/trunk/dist/shpy/net/startserver.py
   shpy/trunk/dist/shpy/net/test/test_basic.py
Log:
- bug fixes to executing code (flushing correctly) 

- the register.register is now more advanced:
  it installs the 'shared.py' module on the server if 
  it doesn't already exist. 

- some more small stuff



Modified: shpy/trunk/dist/shpy/net/gateway.py
==============================================================================
--- shpy/trunk/dist/shpy/net/gateway.py	(original)
+++ shpy/trunk/dist/shpy/net/gateway.py	Sun Jan 18 20:25:56 2004
@@ -2,6 +2,7 @@
 
 import threading, pickle, Queue, select
 
+from unittest2.tool import dyncode
 from shpy.net import common 
 
 class SocketGateway:
@@ -19,11 +20,16 @@
             t.running = 1
             t.gateway = self
             t.start()
+        self.running = 1
 
     def exit(self):
+        self.running = 0
         for t in self.threads:
             t.running = 0
 
+    def __nonzero__(self):
+        return self.running
+
     def exec_remote(self, source):
         self.outgoing.put(source)
 
@@ -34,21 +40,16 @@
         self.queue = queue
 
     def run(self):
-        # here we want to select for incoming calls. 
-        # but only if we have the lock.  
+        sockfile = self.sock.makefile('rb')
+        unpickler = pickle.Unpickler(sockfile)
         while self.running:
-            readlist = [self.sock]
-            r,w,e = select.select(readlist, [], [], 0.2)
-            if self.sock in r:
-                try:
-                    sockfile = self.sock.makefile('r+b')
-                    unpickler = pickle.Unpickler(sockfile)
-                    string = unpickler.load()
-                    self.queue.put(string)
-                except:
-                    import traceback
-                    traceback.print_exc()
-                    self.gateway.exit()
+            try:
+                string = unpickler.load()
+                self.queue.put(string)
+            except:
+                import traceback
+                traceback.print_exc()
+                self.gateway.exit()
 
 
 class QueueExecutor(threading.Thread):
@@ -57,12 +58,13 @@
         self.queue = queue
 
     def run(self):
+        ns = { 'clientgw' : self.gateway}
         while self.running:
             source = self.queue.get()
             try:
-                ns = { 'fromgateway' : self.gateway}
                 print "executing source", source[:10]
-                exec source in ns
+                co = dyncode.makecode(source)
+                exec co in ns
             except:
                 import traceback, sys
                 l = traceback.format_exception(*sys.exc_info())
@@ -80,4 +82,6 @@
             f = self.sock.makefile('wb')
             pickler = pickle.Pickler(f)
             pickler.dump(obj)
+            f.close()
+            #print 'sent', `obj`
 

Modified: shpy/trunk/dist/shpy/net/register.py
==============================================================================
--- shpy/trunk/dist/shpy/net/register.py	(original)
+++ shpy/trunk/dist/shpy/net/register.py	Sun Jan 18 20:25:56 2004
@@ -1,7 +1,7 @@
 
-import autopath
+import autopath, os
 
-def register(hostport = ':8888'):
+def register(hostport = ':8888', share_ns = 'share_ns'):
     if isinstance(hostport, str):
         host, port = hostport.split(':')
         hostport = (host, int(port))
@@ -24,4 +24,17 @@
     assert res=='ok', ("could not establish server gateway %r" %
                        hostport)
 
-    return gateway.SocketGateway(sock)
+    modsource = open(os.path.join(autopath.thisdir, 'shared.py'), 'r').read()
+    gw = gateway.SocketGateway(sock)
+    gw.exec_remote("""
+          try:
+              import %(share_ns)s as shared
+          except ImportError:
+              import new, sys
+              shared = new.module(%(share_ns)r)
+              exec %(modsource)r in vars(shared)
+              sys.modules[%(share_ns)r] = shared
+          shared.registerclient(clientgw)
+          
+    """ % locals())
+    return gw

Modified: shpy/trunk/dist/shpy/net/startserver.py
==============================================================================
--- shpy/trunk/dist/shpy/net/startserver.py	(original)
+++ shpy/trunk/dist/shpy/net/startserver.py	Sun Jan 18 20:25:56 2004
@@ -1,3 +1,5 @@
+#! /usr/bin/env python
+
 """
     start unpickling exec server 
 
@@ -38,7 +40,7 @@
                  'unpickler' : unpickler,
                  'pickler' : pickler}
             co = dyncode.makecode(unpickler.load())
-            exec co in g,g 
+            exec co in g
         except KeyboardInterrupt:
             sys.exit(1)
         except:

Modified: shpy/trunk/dist/shpy/net/test/test_basic.py
==============================================================================
--- shpy/trunk/dist/shpy/net/test/test_basic.py	(original)
+++ shpy/trunk/dist/shpy/net/test/test_basic.py	Sun Jan 18 20:25:56 2004
@@ -30,7 +30,7 @@
 def test_1_server_initialization():
     gw = getservergateway()
 
-    gw.exec_remote('print hello\n')
+    gw.exec_remote('fromgateway.exec_remote( ')
     #res = gw.call_synchronous(functest.f)
     #check.equal(res, 42)