Mercurial > pyshada
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