changeset 1:79bbce42690e

Fix issue of maintainacne of socket map
author Thinker K.F. Li <thinker@codemud.net>
date Mon, 28 Mar 2011 22:36:29 +0800
parents 8c7dfe40b70a
children 369dd74706b3
files comm.py pysh.py shell_agent.py
diffstat 3 files changed, 35 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/comm.py	Mon Mar 28 20:42:37 2011 +0800
+++ b/comm.py	Mon Mar 28 22:36:29 2011 +0800
@@ -42,8 +42,8 @@
 # OPK<data length><data>
 # </verbatim>
 #
-# To close a stdin or stdout session.  Send a 'IED' or 'OED'.
-# A byte of exit code will follow the 'OED'.
+# To close a stdin or stdout of a session.  Send a 'IED' or 'OED'.  A
+# byte of exit code will follow the 'OED'.
 #
 # <verbatim>
 # IED
@@ -227,6 +227,8 @@
         sock = self._sock
         sock.close()
         self._sock = None
+
+        os.remove(self._addr)
         pass
 
     def get_addr(self):
@@ -265,13 +267,16 @@
 
                 socket_map = self._socket_map
                 sock = session.get_sock()
-                socket_map[sock] = session_dispatcher(session, socket_map)
+                socket_map[sock] = session_dispatcher(session, server,
+                                                      socket_map)
                 pass
             pass
 
         class session_dispatcher(object):
-            def __init__(self, session, socket_map):
+            def __init__(self, session, server, socket_map):
                 self._session = session
+                self._server = server
+                self._server_sock = server.get_sock()
                 self._socket_map = socket_map
                 pass
 
@@ -293,6 +298,12 @@
                     sock = session.get_sock()
                     del self._socket_map[sock]
                     pass
+
+                server = self._server
+                if server.is_closed():
+                    sock = self._server_sock
+                    del self._socket_map[sock]
+                    pass
                 pass
             pass
         
@@ -455,14 +466,25 @@
 
     def test_call(args, env, session):
         print 'test_call'
+        print args
+        print env
+        cnt[0] = cnt[0] + 1
         yield
         while True:
             data = session.recv()
             if data == None:
-                return
-            session.send('from client: ' + data)
+                break
+            session.send('from client %x: %s' % (id(session), data))
             yield
             pass
+
+        cnt[0] = cnt[0] - 1
+        if cnt[0] == 0:
+            print 'close server'
+            s.close()
+            pass
+        
+        print 'end of test_call'
         pass
     
     ns = {'data': 'testdata', 'test_call': test_call}
@@ -473,12 +495,15 @@
 
     pid = os.fork()
     if pid == 0:                # child (client)
+        os.fork()               # two clients
+        
         os.environ['PYSHELL_SERVER'] = addr
         c = client('test_call', ['1', '2'], os.environ, sys.stdin, sys.stdout)
         c.connect()
         c.handle()
         pass
     else:                       # parent (server)
+        cnt = [0]
         s.handle()
         pass
     pass
--- a/pysh.py	Mon Mar 28 20:42:37 2011 +0800
+++ b/pysh.py	Mon Mar 28 22:36:29 2011 +0800
@@ -12,6 +12,9 @@
     os.system(env + ';' + cmd)
     pass
 
+def runv(cmd):
+    pass
+
 if __name__ == '__main__':
     for i in range(20):
         run('echo $i')
--- a/shell_agent.py	Mon Mar 28 20:42:37 2011 +0800
+++ b/shell_agent.py	Mon Mar 28 22:36:29 2011 +0800
@@ -10,4 +10,5 @@
     args = sys.argv[2:]
     client = comm.client(cmd, args, os.environ, sys.stdin, sys.stdout)
     client.connect()
+    client.handle()
     pass