annotate Lib/idlelib/rpc.py @ 79675:c0a2294de787 2.7

Issue #16199: Backport 2to3 typo fix from 3.2.
author Chris Jerdonek <chris.jerdonek@gmail.com>
date Thu, 11 Oct 2012 16:15:46 -0700
parents 684960fb1cbf
children cd0191a9b5c9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
24386
0e27b67247da Reverse the RPC socket connection: Python execution server connects to
Kurt B. Kaiser <kbk@shore.net>
parents: 23995
diff changeset
1 """RPC Implemention, originally written for the Python Idle IDE
0e27b67247da Reverse the RPC socket connection: Python execution server connects to
Kurt B. Kaiser <kbk@shore.net>
parents: 23995
diff changeset
2
0e27b67247da Reverse the RPC socket connection: Python execution server connects to
Kurt B. Kaiser <kbk@shore.net>
parents: 23995
diff changeset
3 For security reasons, GvR requested that Idle's Python execution server process
0e27b67247da Reverse the RPC socket connection: Python execution server connects to
Kurt B. Kaiser <kbk@shore.net>
parents: 23995
diff changeset
4 connect to the Idle process, which listens for the connection. Since Idle has
0e27b67247da Reverse the RPC socket connection: Python execution server connects to
Kurt B. Kaiser <kbk@shore.net>
parents: 23995
diff changeset
5 has only one client per server, this was not a limitation.
0e27b67247da Reverse the RPC socket connection: Python execution server connects to
Kurt B. Kaiser <kbk@shore.net>
parents: 23995
diff changeset
6
0e27b67247da Reverse the RPC socket connection: Python execution server connects to
Kurt B. Kaiser <kbk@shore.net>
parents: 23995
diff changeset
7 +---------------------------------+ +-------------+
47241
ba1fa511b72d socketserver renaming reversal part 3: move the module into the right
Georg Brandl <georg@python.org>
parents: 47189
diff changeset
8 | SocketServer.BaseRequestHandler | | SocketIO |
24386
0e27b67247da Reverse the RPC socket connection: Python execution server connects to
Kurt B. Kaiser <kbk@shore.net>
parents: 23995
diff changeset
9 +---------------------------------+ +-------------+
0e27b67247da Reverse the RPC socket connection: Python execution server connects to
Kurt B. Kaiser <kbk@shore.net>
parents: 23995
diff changeset
10 ^ | register() |
0e27b67247da Reverse the RPC socket connection: Python execution server connects to
Kurt B. Kaiser <kbk@shore.net>
parents: 23995
diff changeset
11 | | unregister()|
0e27b67247da Reverse the RPC socket connection: Python execution server connects to
Kurt B. Kaiser <kbk@shore.net>
parents: 23995
diff changeset
12 | +-------------+
0e27b67247da Reverse the RPC socket connection: Python execution server connects to
Kurt B. Kaiser <kbk@shore.net>
parents: 23995
diff changeset
13 | ^ ^
0e27b67247da Reverse the RPC socket connection: Python execution server connects to
Kurt B. Kaiser <kbk@shore.net>
parents: 23995
diff changeset
14 | | |
0e27b67247da Reverse the RPC socket connection: Python execution server connects to
Kurt B. Kaiser <kbk@shore.net>
parents: 23995
diff changeset
15 | + -------------------+ |
0e27b67247da Reverse the RPC socket connection: Python execution server connects to
Kurt B. Kaiser <kbk@shore.net>
parents: 23995
diff changeset
16 | | |
0e27b67247da Reverse the RPC socket connection: Python execution server connects to
Kurt B. Kaiser <kbk@shore.net>
parents: 23995
diff changeset
17 +-------------------------+ +-----------------+
0e27b67247da Reverse the RPC socket connection: Python execution server connects to
Kurt B. Kaiser <kbk@shore.net>
parents: 23995
diff changeset
18 | RPCHandler | | RPCClient |
0e27b67247da Reverse the RPC socket connection: Python execution server connects to
Kurt B. Kaiser <kbk@shore.net>
parents: 23995
diff changeset
19 | [attribute of RPCServer]| | |
0e27b67247da Reverse the RPC socket connection: Python execution server connects to
Kurt B. Kaiser <kbk@shore.net>
parents: 23995
diff changeset
20 +-------------------------+ +-----------------+
0e27b67247da Reverse the RPC socket connection: Python execution server connects to
Kurt B. Kaiser <kbk@shore.net>
parents: 23995
diff changeset
21
0e27b67247da Reverse the RPC socket connection: Python execution server connects to
Kurt B. Kaiser <kbk@shore.net>
parents: 23995
diff changeset
22 The RPCServer handler class is expected to provide register/unregister methods.
0e27b67247da Reverse the RPC socket connection: Python execution server connects to
Kurt B. Kaiser <kbk@shore.net>
parents: 23995
diff changeset
23 RPCHandler inherits the mix-in class SocketIO, which provides these methods.
0e27b67247da Reverse the RPC socket connection: Python execution server connects to
Kurt B. Kaiser <kbk@shore.net>
parents: 23995
diff changeset
24
0e27b67247da Reverse the RPC socket connection: Python execution server connects to
Kurt B. Kaiser <kbk@shore.net>
parents: 23995
diff changeset
25 See the Idle run.main() docstring for further information on how this was
0e27b67247da Reverse the RPC socket connection: Python execution server connects to
Kurt B. Kaiser <kbk@shore.net>
parents: 23995
diff changeset
26 accomplished in Idle.
0e27b67247da Reverse the RPC socket connection: Python execution server connects to
Kurt B. Kaiser <kbk@shore.net>
parents: 23995
diff changeset
27
0e27b67247da Reverse the RPC socket connection: Python execution server connects to
Kurt B. Kaiser <kbk@shore.net>
parents: 23995
diff changeset
28 """
0e27b67247da Reverse the RPC socket connection: Python execution server connects to
Kurt B. Kaiser <kbk@shore.net>
parents: 23995
diff changeset
29
0e27b67247da Reverse the RPC socket connection: Python execution server connects to
Kurt B. Kaiser <kbk@shore.net>
parents: 23995
diff changeset
30 import sys
29034
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
31 import os
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
32 import socket
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
33 import select
47241
ba1fa511b72d socketserver renaming reversal part 3: move the module into the right
Georg Brandl <georg@python.org>
parents: 47189
diff changeset
34 import SocketServer
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
35 import struct
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
36 import cPickle as pickle
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
37 import threading
47248
9acb314b9072 Queue renaming reversal part 3: move module into place and
Georg Brandl <georg@python.org>
parents: 47241
diff changeset
38 import Queue
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
39 import traceback
47189
f419b2e96a98 Revert copy_reg -> copyreg rename.
Georg Brandl <georg@python.org>
parents: 46929
diff changeset
40 import copy_reg
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
41 import types
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
42 import marshal
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
43
29034
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
44
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
45 def unpickle_code(ms):
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
46 co = marshal.loads(ms)
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
47 assert isinstance(co, types.CodeType)
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
48 return co
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
49
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
50 def pickle_code(co):
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
51 assert isinstance(co, types.CodeType)
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
52 ms = marshal.dumps(co)
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
53 return unpickle_code, (ms,)
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
54
25020
e41058845b79 1. Revert subprocess environment clearing, will restart subprocess
Kurt B. Kaiser <kbk@shore.net>
parents: 25019
diff changeset
55 # XXX KBK 24Aug02 function pickling capability not used in Idle
e41058845b79 1. Revert subprocess environment clearing, will restart subprocess
Kurt B. Kaiser <kbk@shore.net>
parents: 25019
diff changeset
56 # def unpickle_function(ms):
e41058845b79 1. Revert subprocess environment clearing, will restart subprocess
Kurt B. Kaiser <kbk@shore.net>
parents: 25019
diff changeset
57 # return ms
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
58
25020
e41058845b79 1. Revert subprocess environment clearing, will restart subprocess
Kurt B. Kaiser <kbk@shore.net>
parents: 25019
diff changeset
59 # def pickle_function(fn):
e41058845b79 1. Revert subprocess environment clearing, will restart subprocess
Kurt B. Kaiser <kbk@shore.net>
parents: 25019
diff changeset
60 # assert isinstance(fn, type.FunctionType)
31515
71a294bd7950 Replace backticks with repr() or "%r"
Walter Dörwald <walter@livinglogic.de>
parents: 31413
diff changeset
61 # return repr(fn)
26959
b8c72e86a12d Whitespace Normalization
Kurt B. Kaiser <kbk@shore.net>
parents: 26768
diff changeset
62
47189
f419b2e96a98 Revert copy_reg -> copyreg rename.
Georg Brandl <georg@python.org>
parents: 46929
diff changeset
63 copy_reg.pickle(types.CodeType, pickle_code, unpickle_code)
f419b2e96a98 Revert copy_reg -> copyreg rename.
Georg Brandl <georg@python.org>
parents: 46929
diff changeset
64 # copy_reg.pickle(types.FunctionType, pickle_function, unpickle_function)
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
65
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
66 BUFSIZE = 8*1024
29365
72ce7cc03f27 Avoid problem resolving 'localhost'
Kurt B. Kaiser <kbk@shore.net>
parents: 29254
diff changeset
67 LOCALHOST = '127.0.0.1'
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
68
47241
ba1fa511b72d socketserver renaming reversal part 3: move the module into the right
Georg Brandl <georg@python.org>
parents: 47189
diff changeset
69 class RPCServer(SocketServer.TCPServer):
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
70
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
71 def __init__(self, addr, handlerclass=None):
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
72 if handlerclass is None:
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
73 handlerclass = RPCHandler
47241
ba1fa511b72d socketserver renaming reversal part 3: move the module into the right
Georg Brandl <georg@python.org>
parents: 47189
diff changeset
74 SocketServer.TCPServer.__init__(self, addr, handlerclass)
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
75
24386
0e27b67247da Reverse the RPC socket connection: Python execution server connects to
Kurt B. Kaiser <kbk@shore.net>
parents: 23995
diff changeset
76 def server_bind(self):
0e27b67247da Reverse the RPC socket connection: Python execution server connects to
Kurt B. Kaiser <kbk@shore.net>
parents: 23995
diff changeset
77 "Override TCPServer method, no bind() phase for connecting entity"
0e27b67247da Reverse the RPC socket connection: Python execution server connects to
Kurt B. Kaiser <kbk@shore.net>
parents: 23995
diff changeset
78 pass
0e27b67247da Reverse the RPC socket connection: Python execution server connects to
Kurt B. Kaiser <kbk@shore.net>
parents: 23995
diff changeset
79
0e27b67247da Reverse the RPC socket connection: Python execution server connects to
Kurt B. Kaiser <kbk@shore.net>
parents: 23995
diff changeset
80 def server_activate(self):
0e27b67247da Reverse the RPC socket connection: Python execution server connects to
Kurt B. Kaiser <kbk@shore.net>
parents: 23995
diff changeset
81 """Override TCPServer method, connect() instead of listen()
26959
b8c72e86a12d Whitespace Normalization
Kurt B. Kaiser <kbk@shore.net>
parents: 26768
diff changeset
82
24386
0e27b67247da Reverse the RPC socket connection: Python execution server connects to
Kurt B. Kaiser <kbk@shore.net>
parents: 23995
diff changeset
83 Due to the reversed connection, self.server_address is actually the
0e27b67247da Reverse the RPC socket connection: Python execution server connects to
Kurt B. Kaiser <kbk@shore.net>
parents: 23995
diff changeset
84 address of the Idle Client to which we are connecting.
23995
41468f9353ce Shutdown subprocess debugger and associated Proxies/Adapters when closing
Kurt B. Kaiser <kbk@shore.net>
parents: 23876
diff changeset
85
24386
0e27b67247da Reverse the RPC socket connection: Python execution server connects to
Kurt B. Kaiser <kbk@shore.net>
parents: 23995
diff changeset
86 """
0e27b67247da Reverse the RPC socket connection: Python execution server connects to
Kurt B. Kaiser <kbk@shore.net>
parents: 23995
diff changeset
87 self.socket.connect(self.server_address)
26959
b8c72e86a12d Whitespace Normalization
Kurt B. Kaiser <kbk@shore.net>
parents: 26768
diff changeset
88
24386
0e27b67247da Reverse the RPC socket connection: Python execution server connects to
Kurt B. Kaiser <kbk@shore.net>
parents: 23995
diff changeset
89 def get_request(self):
0e27b67247da Reverse the RPC socket connection: Python execution server connects to
Kurt B. Kaiser <kbk@shore.net>
parents: 23995
diff changeset
90 "Override TCPServer method, return already connected socket"
0e27b67247da Reverse the RPC socket connection: Python execution server connects to
Kurt B. Kaiser <kbk@shore.net>
parents: 23995
diff changeset
91 return self.socket, self.server_address
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
92
27920
8e7432cdf7d8 M NEWS.txt
Kurt B. Kaiser <kbk@shore.net>
parents: 27545
diff changeset
93 def handle_error(self, request, client_address):
28384
b872297406aa Improve error message handling.
Kurt B. Kaiser <kbk@shore.net>
parents: 28294
diff changeset
94 """Override TCPServer method
b872297406aa Improve error message handling.
Kurt B. Kaiser <kbk@shore.net>
parents: 28294
diff changeset
95
b872297406aa Improve error message handling.
Kurt B. Kaiser <kbk@shore.net>
parents: 28294
diff changeset
96 Error message goes to __stderr__. No error message if exiting
b872297406aa Improve error message handling.
Kurt B. Kaiser <kbk@shore.net>
parents: 28294
diff changeset
97 normally or socket raised EOF. Other exceptions not handled in
b872297406aa Improve error message handling.
Kurt B. Kaiser <kbk@shore.net>
parents: 28294
diff changeset
98 server code will cause os._exit.
b872297406aa Improve error message handling.
Kurt B. Kaiser <kbk@shore.net>
parents: 28294
diff changeset
99
b872297406aa Improve error message handling.
Kurt B. Kaiser <kbk@shore.net>
parents: 28294
diff changeset
100 """
27920
8e7432cdf7d8 M NEWS.txt
Kurt B. Kaiser <kbk@shore.net>
parents: 27545
diff changeset
101 try:
8e7432cdf7d8 M NEWS.txt
Kurt B. Kaiser <kbk@shore.net>
parents: 27545
diff changeset
102 raise
8e7432cdf7d8 M NEWS.txt
Kurt B. Kaiser <kbk@shore.net>
parents: 27545
diff changeset
103 except SystemExit:
8e7432cdf7d8 M NEWS.txt
Kurt B. Kaiser <kbk@shore.net>
parents: 27545
diff changeset
104 raise
28384
b872297406aa Improve error message handling.
Kurt B. Kaiser <kbk@shore.net>
parents: 28294
diff changeset
105 except:
28386
94601d8fa51d Correct error in last checkin noticed by Neal Norwitz. And some more.
Kurt B. Kaiser <kbk@shore.net>
parents: 28384
diff changeset
106 erf = sys.__stderr__
94601d8fa51d Correct error in last checkin noticed by Neal Norwitz. And some more.
Kurt B. Kaiser <kbk@shore.net>
parents: 28384
diff changeset
107 print>>erf, '\n' + '-'*40
28384
b872297406aa Improve error message handling.
Kurt B. Kaiser <kbk@shore.net>
parents: 28294
diff changeset
108 print>>erf, 'Unhandled server exception!'
b872297406aa Improve error message handling.
Kurt B. Kaiser <kbk@shore.net>
parents: 28294
diff changeset
109 print>>erf, 'Thread: %s' % threading.currentThread().getName()
28386
94601d8fa51d Correct error in last checkin noticed by Neal Norwitz. And some more.
Kurt B. Kaiser <kbk@shore.net>
parents: 28384
diff changeset
110 print>>erf, 'Client Address: ', client_address
28384
b872297406aa Improve error message handling.
Kurt B. Kaiser <kbk@shore.net>
parents: 28294
diff changeset
111 print>>erf, 'Request: ', repr(request)
b872297406aa Improve error message handling.
Kurt B. Kaiser <kbk@shore.net>
parents: 28294
diff changeset
112 traceback.print_exc(file=erf)
b872297406aa Improve error message handling.
Kurt B. Kaiser <kbk@shore.net>
parents: 28294
diff changeset
113 print>>erf, '\n*** Unrecoverable, server exiting!'
b872297406aa Improve error message handling.
Kurt B. Kaiser <kbk@shore.net>
parents: 28294
diff changeset
114 print>>erf, '-'*40
28386
94601d8fa51d Correct error in last checkin noticed by Neal Norwitz. And some more.
Kurt B. Kaiser <kbk@shore.net>
parents: 28384
diff changeset
115 os._exit(0)
27920
8e7432cdf7d8 M NEWS.txt
Kurt B. Kaiser <kbk@shore.net>
parents: 27545
diff changeset
116
29034
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
117 #----------------- end class RPCServer --------------------
27920
8e7432cdf7d8 M NEWS.txt
Kurt B. Kaiser <kbk@shore.net>
parents: 27545
diff changeset
118
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
119 objecttable = {}
47248
9acb314b9072 Queue renaming reversal part 3: move module into place and
Georg Brandl <georg@python.org>
parents: 47241
diff changeset
120 request_queue = Queue.Queue(0)
9acb314b9072 Queue renaming reversal part 3: move module into place and
Georg Brandl <georg@python.org>
parents: 47241
diff changeset
121 response_queue = Queue.Queue(0)
29034
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
122
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
123
34212
1e8b033f91dc The remote procedure call module rpc.py can now access data attributes of
Kurt B. Kaiser <kbk@shore.net>
parents: 31515
diff changeset
124 class SocketIO(object):
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
125
27366
6147bc14d277 1. Eliminate putrequest(): only used in asynccall(), merge it there.
Kurt B. Kaiser <kbk@shore.net>
parents: 26959
diff changeset
126 nextseq = 0
6147bc14d277 1. Eliminate putrequest(): only used in asynccall(), merge it there.
Kurt B. Kaiser <kbk@shore.net>
parents: 26959
diff changeset
127
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
128 def __init__(self, sock, objtable=None, debugging=None):
29034
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
129 self.sockthread = threading.currentThread()
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
130 if debugging is not None:
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
131 self.debugging = debugging
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
132 self.sock = sock
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
133 if objtable is None:
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
134 objtable = objecttable
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
135 self.objtable = objtable
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
136 self.responses = {}
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
137 self.cvars = {}
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
138
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
139 def close(self):
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
140 sock = self.sock
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
141 self.sock = None
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
142 if sock is not None:
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
143 sock.close()
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
144
29034
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
145 def exithook(self):
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
146 "override for specific exit action"
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
147 os._exit()
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
148
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
149 def debug(self, *args):
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
150 if not self.debugging:
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
151 return
26557
4be62dc9a3e7 M PyShell.py
Kurt B. Kaiser <kbk@shore.net>
parents: 26468
diff changeset
152 s = self.location + " " + str(threading.currentThread().getName())
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
153 for a in args:
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
154 s = s + " " + str(a)
26557
4be62dc9a3e7 M PyShell.py
Kurt B. Kaiser <kbk@shore.net>
parents: 26468
diff changeset
155 print>>sys.__stderr__, s
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
156
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
157 def register(self, oid, object):
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
158 self.objtable[oid] = object
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
159
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
160 def unregister(self, oid):
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
161 try:
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
162 del self.objtable[oid]
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
163 except KeyError:
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
164 pass
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
165
29034
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
166 def localcall(self, seq, request):
26959
b8c72e86a12d Whitespace Normalization
Kurt B. Kaiser <kbk@shore.net>
parents: 26768
diff changeset
167 self.debug("localcall:", request)
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
168 try:
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
169 how, (oid, methodname, args, kwargs) = request
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
170 except TypeError:
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
171 return ("ERROR", "Bad request format")
56436
684960fb1cbf replace has_key with 'in' operator
Benjamin Peterson <benjamin@python.org>
parents: 56435
diff changeset
172 if oid not in self.objtable:
31515
71a294bd7950 Replace backticks with repr() or "%r"
Walter Dörwald <walter@livinglogic.de>
parents: 31413
diff changeset
173 return ("ERROR", "Unknown object id: %r" % (oid,))
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
174 obj = self.objtable[oid]
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
175 if methodname == "__methods__":
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
176 methods = {}
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
177 _getmethods(obj, methods)
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
178 return ("OK", methods)
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
179 if methodname == "__attributes__":
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
180 attributes = {}
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
181 _getattributes(obj, attributes)
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
182 return ("OK", attributes)
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
183 if not hasattr(obj, methodname):
31515
71a294bd7950 Replace backticks with repr() or "%r"
Walter Dörwald <walter@livinglogic.de>
parents: 31413
diff changeset
184 return ("ERROR", "Unsupported method name: %r" % (methodname,))
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
185 method = getattr(obj, methodname)
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
186 try:
29034
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
187 if how == 'CALL':
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
188 ret = method(*args, **kwargs)
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
189 if isinstance(ret, RemoteObject):
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
190 ret = remoteref(ret)
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
191 return ("OK", ret)
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
192 elif how == 'QUEUE':
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
193 request_queue.put((seq, (method, args, kwargs)))
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
194 return("QUEUED", None)
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
195 else:
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
196 return ("ERROR", "Unsupported message type: %s" % how)
27920
8e7432cdf7d8 M NEWS.txt
Kurt B. Kaiser <kbk@shore.net>
parents: 27545
diff changeset
197 except SystemExit:
8e7432cdf7d8 M NEWS.txt
Kurt B. Kaiser <kbk@shore.net>
parents: 27545
diff changeset
198 raise
28266
bea3d1fda3dc M PyShell.py
Kurt B. Kaiser <kbk@shore.net>
parents: 28096
diff changeset
199 except socket.error:
29034
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
200 raise
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
201 except:
34244
b044735c927b Improve error message if rpc'l localcall() fails with unexpected
Kurt B. Kaiser <kbk@shore.net>
parents: 34212
diff changeset
202 msg = "*** Internal Error: rpc.py:SocketIO.localcall()\n\n"\
b044735c927b Improve error message if rpc'l localcall() fails with unexpected
Kurt B. Kaiser <kbk@shore.net>
parents: 34212
diff changeset
203 " Object: %s \n Method: %s \n Args: %s\n"
b044735c927b Improve error message if rpc'l localcall() fails with unexpected
Kurt B. Kaiser <kbk@shore.net>
parents: 34212
diff changeset
204 print>>sys.__stderr__, msg % (oid, method, args)
28096
31008433c74f M rpc.py
Kurt B. Kaiser <kbk@shore.net>
parents: 27920
diff changeset
205 traceback.print_exc(file=sys.__stderr__)
27545
f9822b18cf91 M PyShell.py
Kurt B. Kaiser <kbk@shore.net>
parents: 27379
diff changeset
206 return ("EXCEPTION", None)
f9822b18cf91 M PyShell.py
Kurt B. Kaiser <kbk@shore.net>
parents: 27379
diff changeset
207
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
208 def remotecall(self, oid, methodname, args, kwargs):
27920
8e7432cdf7d8 M NEWS.txt
Kurt B. Kaiser <kbk@shore.net>
parents: 27545
diff changeset
209 self.debug("remotecall:asynccall: ", oid, methodname)
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
210 seq = self.asynccall(oid, methodname, args, kwargs)
26557
4be62dc9a3e7 M PyShell.py
Kurt B. Kaiser <kbk@shore.net>
parents: 26468
diff changeset
211 return self.asyncreturn(seq)
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
212
29034
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
213 def remotequeue(self, oid, methodname, args, kwargs):
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
214 self.debug("remotequeue:asyncqueue: ", oid, methodname)
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
215 seq = self.asyncqueue(oid, methodname, args, kwargs)
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
216 return self.asyncreturn(seq)
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
217
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
218 def asynccall(self, oid, methodname, args, kwargs):
29034
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
219 request = ("CALL", (oid, methodname, args, kwargs))
27366
6147bc14d277 1. Eliminate putrequest(): only used in asynccall(), merge it there.
Kurt B. Kaiser <kbk@shore.net>
parents: 26959
diff changeset
220 seq = self.newseq()
29034
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
221 if threading.currentThread() != self.sockthread:
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
222 cvar = threading.Condition()
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
223 self.cvars[seq] = cvar
27366
6147bc14d277 1. Eliminate putrequest(): only used in asynccall(), merge it there.
Kurt B. Kaiser <kbk@shore.net>
parents: 26959
diff changeset
224 self.debug(("asynccall:%d:" % seq), oid, methodname, args, kwargs)
6147bc14d277 1. Eliminate putrequest(): only used in asynccall(), merge it there.
Kurt B. Kaiser <kbk@shore.net>
parents: 26959
diff changeset
225 self.putmessage((seq, request))
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
226 return seq
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
227
29034
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
228 def asyncqueue(self, oid, methodname, args, kwargs):
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
229 request = ("QUEUE", (oid, methodname, args, kwargs))
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
230 seq = self.newseq()
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
231 if threading.currentThread() != self.sockthread:
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
232 cvar = threading.Condition()
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
233 self.cvars[seq] = cvar
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
234 self.debug(("asyncqueue:%d:" % seq), oid, methodname, args, kwargs)
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
235 self.putmessage((seq, request))
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
236 return seq
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
237
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
238 def asyncreturn(self, seq):
27366
6147bc14d277 1. Eliminate putrequest(): only used in asynccall(), merge it there.
Kurt B. Kaiser <kbk@shore.net>
parents: 26959
diff changeset
239 self.debug("asyncreturn:%d:call getresponse(): " % seq)
29034
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
240 response = self.getresponse(seq, wait=0.05)
27366
6147bc14d277 1. Eliminate putrequest(): only used in asynccall(), merge it there.
Kurt B. Kaiser <kbk@shore.net>
parents: 26959
diff changeset
241 self.debug(("asyncreturn:%d:response: " % seq), response)
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
242 return self.decoderesponse(response)
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
243
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
244 def decoderesponse(self, response):
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
245 how, what = response
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
246 if how == "OK":
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
247 return what
29034
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
248 if how == "QUEUED":
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
249 return None
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
250 if how == "EXCEPTION":
27920
8e7432cdf7d8 M NEWS.txt
Kurt B. Kaiser <kbk@shore.net>
parents: 27545
diff changeset
251 self.debug("decoderesponse: EXCEPTION")
8e7432cdf7d8 M NEWS.txt
Kurt B. Kaiser <kbk@shore.net>
parents: 27545
diff changeset
252 return None
29034
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
253 if how == "EOF":
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
254 self.debug("decoderesponse: EOF")
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
255 self.decode_interrupthook()
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
256 return None
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
257 if how == "ERROR":
26959
b8c72e86a12d Whitespace Normalization
Kurt B. Kaiser <kbk@shore.net>
parents: 26768
diff changeset
258 self.debug("decoderesponse: Internal ERROR:", what)
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
259 raise RuntimeError, what
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
260 raise SystemError, (how, what)
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
261
29034
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
262 def decode_interrupthook(self):
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
263 ""
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
264 raise EOFError
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
265
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
266 def mainloop(self):
27366
6147bc14d277 1. Eliminate putrequest(): only used in asynccall(), merge it there.
Kurt B. Kaiser <kbk@shore.net>
parents: 26959
diff changeset
267 """Listen on socket until I/O not ready or EOF
6147bc14d277 1. Eliminate putrequest(): only used in asynccall(), merge it there.
Kurt B. Kaiser <kbk@shore.net>
parents: 26959
diff changeset
268
29034
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
269 pollresponse() will loop looking for seq number None, which
28294
65dd9612a748 Move setting of ioready 'wait' earlier in call chain, to
Kurt B. Kaiser <kbk@shore.net>
parents: 28282
diff changeset
270 never comes, and exit on EOFError.
27366
6147bc14d277 1. Eliminate putrequest(): only used in asynccall(), merge it there.
Kurt B. Kaiser <kbk@shore.net>
parents: 26959
diff changeset
271
6147bc14d277 1. Eliminate putrequest(): only used in asynccall(), merge it there.
Kurt B. Kaiser <kbk@shore.net>
parents: 26959
diff changeset
272 """
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
273 try:
29034
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
274 self.getresponse(myseq=None, wait=0.05)
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
275 except EOFError:
29034
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
276 self.debug("mainloop:return")
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
277 return
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
278
28294
65dd9612a748 Move setting of ioready 'wait' earlier in call chain, to
Kurt B. Kaiser <kbk@shore.net>
parents: 28282
diff changeset
279 def getresponse(self, myseq, wait):
65dd9612a748 Move setting of ioready 'wait' earlier in call chain, to
Kurt B. Kaiser <kbk@shore.net>
parents: 28282
diff changeset
280 response = self._getresponse(myseq, wait)
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
281 if response is not None:
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
282 how, what = response
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
283 if how == "OK":
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
284 response = how, self._proxify(what)
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
285 return response
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
286
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
287 def _proxify(self, obj):
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
288 if isinstance(obj, RemoteProxy):
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
289 return RPCProxy(self, obj.oid)
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
290 if isinstance(obj, types.ListType):
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
291 return map(self._proxify, obj)
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
292 # XXX Check for other types -- not currently needed
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
293 return obj
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
294
28294
65dd9612a748 Move setting of ioready 'wait' earlier in call chain, to
Kurt B. Kaiser <kbk@shore.net>
parents: 28282
diff changeset
295 def _getresponse(self, myseq, wait):
27366
6147bc14d277 1. Eliminate putrequest(): only used in asynccall(), merge it there.
Kurt B. Kaiser <kbk@shore.net>
parents: 26959
diff changeset
296 self.debug("_getresponse:myseq:", myseq)
29034
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
297 if threading.currentThread() is self.sockthread:
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
298 # this thread does all reading of requests or responses
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
299 while 1:
28294
65dd9612a748 Move setting of ioready 'wait' earlier in call chain, to
Kurt B. Kaiser <kbk@shore.net>
parents: 28282
diff changeset
300 response = self.pollresponse(myseq, wait)
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
301 if response is not None:
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
302 return response
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
303 else:
29034
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
304 # wait for notification from socket handling thread
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
305 cvar = self.cvars[myseq]
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
306 cvar.acquire()
56436
684960fb1cbf replace has_key with 'in' operator
Benjamin Peterson <benjamin@python.org>
parents: 56435
diff changeset
307 while myseq not in self.responses:
29034
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
308 cvar.wait()
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
309 response = self.responses[myseq]
29034
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
310 self.debug("_getresponse:%s: thread woke up: response: %s" %
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
311 (myseq, response))
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
312 del self.responses[myseq]
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
313 del self.cvars[myseq]
29034
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
314 cvar.release()
27920
8e7432cdf7d8 M NEWS.txt
Kurt B. Kaiser <kbk@shore.net>
parents: 27545
diff changeset
315 return response
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
316
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
317 def newseq(self):
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
318 self.nextseq = seq = self.nextseq + 2
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
319 return seq
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
320
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
321 def putmessage(self, message):
27366
6147bc14d277 1. Eliminate putrequest(): only used in asynccall(), merge it there.
Kurt B. Kaiser <kbk@shore.net>
parents: 26959
diff changeset
322 self.debug("putmessage:%d:" % message[0])
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
323 try:
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
324 s = pickle.dumps(message)
31413
ec8a4685b360 rpc.py:SocketIO - Large modules were generating large pickles when downloaded
Kurt B. Kaiser <kbk@shore.net>
parents: 30390
diff changeset
325 except pickle.PicklingError:
31515
71a294bd7950 Replace backticks with repr() or "%r"
Walter Dörwald <walter@livinglogic.de>
parents: 31413
diff changeset
326 print >>sys.__stderr__, "Cannot pickle:", repr(message)
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
327 raise
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
328 s = struct.pack("<i", len(s)) + s
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
329 while len(s) > 0:
27920
8e7432cdf7d8 M NEWS.txt
Kurt B. Kaiser <kbk@shore.net>
parents: 27545
diff changeset
330 try:
31413
ec8a4685b360 rpc.py:SocketIO - Large modules were generating large pickles when downloaded
Kurt B. Kaiser <kbk@shore.net>
parents: 30390
diff changeset
331 r, w, x = select.select([], [self.sock], [])
ec8a4685b360 rpc.py:SocketIO - Large modules were generating large pickles when downloaded
Kurt B. Kaiser <kbk@shore.net>
parents: 30390
diff changeset
332 n = self.sock.send(s[:BUFSIZE])
34948
e4e0cff16bc7 Improve subprocess link error notification
Kurt B. Kaiser <kbk@shore.net>
parents: 34244
diff changeset
333 except (AttributeError, TypeError):
e4e0cff16bc7 Improve subprocess link error notification
Kurt B. Kaiser <kbk@shore.net>
parents: 34244
diff changeset
334 raise IOError, "socket no longer exists"
e4e0cff16bc7 Improve subprocess link error notification
Kurt B. Kaiser <kbk@shore.net>
parents: 34244
diff changeset
335 except socket.error:
e4e0cff16bc7 Improve subprocess link error notification
Kurt B. Kaiser <kbk@shore.net>
parents: 34244
diff changeset
336 raise
27920
8e7432cdf7d8 M NEWS.txt
Kurt B. Kaiser <kbk@shore.net>
parents: 27545
diff changeset
337 else:
8e7432cdf7d8 M NEWS.txt
Kurt B. Kaiser <kbk@shore.net>
parents: 27545
diff changeset
338 s = s[n:]
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
339
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
340 buffer = ""
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
341 bufneed = 4
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
342 bufstate = 0 # meaning: 0 => reading count; 1 => reading data
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
343
29034
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
344 def pollpacket(self, wait):
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
345 self._stage0()
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
346 if len(self.buffer) < self.bufneed:
31413
ec8a4685b360 rpc.py:SocketIO - Large modules were generating large pickles when downloaded
Kurt B. Kaiser <kbk@shore.net>
parents: 30390
diff changeset
347 r, w, x = select.select([self.sock.fileno()], [], [], wait)
ec8a4685b360 rpc.py:SocketIO - Large modules were generating large pickles when downloaded
Kurt B. Kaiser <kbk@shore.net>
parents: 30390
diff changeset
348 if len(r) == 0:
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
349 return None
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
350 try:
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
351 s = self.sock.recv(BUFSIZE)
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
352 except socket.error:
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
353 raise EOFError
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
354 if len(s) == 0:
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
355 raise EOFError
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
356 self.buffer += s
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
357 self._stage0()
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
358 return self._stage1()
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
359
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
360 def _stage0(self):
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
361 if self.bufstate == 0 and len(self.buffer) >= 4:
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
362 s = self.buffer[:4]
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
363 self.buffer = self.buffer[4:]
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
364 self.bufneed = struct.unpack("<i", s)[0]
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
365 self.bufstate = 1
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
366
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
367 def _stage1(self):
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
368 if self.bufstate == 1 and len(self.buffer) >= self.bufneed:
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
369 packet = self.buffer[:self.bufneed]
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
370 self.buffer = self.buffer[self.bufneed:]
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
371 self.bufneed = 4
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
372 self.bufstate = 0
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
373 return packet
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
374
29034
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
375 def pollmessage(self, wait):
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
376 packet = self.pollpacket(wait)
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
377 if packet is None:
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
378 return None
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
379 try:
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
380 message = pickle.loads(packet)
31413
ec8a4685b360 rpc.py:SocketIO - Large modules were generating large pickles when downloaded
Kurt B. Kaiser <kbk@shore.net>
parents: 30390
diff changeset
381 except pickle.UnpicklingError:
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
382 print >>sys.__stderr__, "-----------------------"
31515
71a294bd7950 Replace backticks with repr() or "%r"
Walter Dörwald <walter@livinglogic.de>
parents: 31413
diff changeset
383 print >>sys.__stderr__, "cannot unpickle packet:", repr(packet)
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
384 traceback.print_stack(file=sys.__stderr__)
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
385 print >>sys.__stderr__, "-----------------------"
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
386 raise
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
387 return message
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
388
29034
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
389 def pollresponse(self, myseq, wait):
27366
6147bc14d277 1. Eliminate putrequest(): only used in asynccall(), merge it there.
Kurt B. Kaiser <kbk@shore.net>
parents: 26959
diff changeset
390 """Handle messages received on the socket.
6147bc14d277 1. Eliminate putrequest(): only used in asynccall(), merge it there.
Kurt B. Kaiser <kbk@shore.net>
parents: 26959
diff changeset
391
29034
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
392 Some messages received may be asynchronous 'call' or 'queue' requests,
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
393 and some may be responses for other threads.
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
394
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
395 'call' requests are passed to self.localcall() with the expectation of
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
396 immediate execution, during which time the socket is not serviced.
27366
6147bc14d277 1. Eliminate putrequest(): only used in asynccall(), merge it there.
Kurt B. Kaiser <kbk@shore.net>
parents: 26959
diff changeset
397
29034
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
398 'queue' requests are used for tasks (which may block or hang) to be
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
399 processed in a different thread. These requests are fed into
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
400 request_queue by self.localcall(). Responses to queued requests are
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
401 taken from response_queue and sent across the link with the associated
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
402 sequence numbers. Messages in the queues are (sequence_number,
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
403 request/response) tuples and code using this module removing messages
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
404 from the request_queue is responsible for returning the correct
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
405 sequence number in the response_queue.
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
406
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
407 pollresponse() will loop until a response message with the myseq
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
408 sequence number is received, and will save other responses in
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
409 self.responses and notify the owning thread.
27366
6147bc14d277 1. Eliminate putrequest(): only used in asynccall(), merge it there.
Kurt B. Kaiser <kbk@shore.net>
parents: 26959
diff changeset
410
6147bc14d277 1. Eliminate putrequest(): only used in asynccall(), merge it there.
Kurt B. Kaiser <kbk@shore.net>
parents: 26959
diff changeset
411 """
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
412 while 1:
29034
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
413 # send queued response if there is one available
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
414 try:
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
415 qmsg = response_queue.get(0)
47248
9acb314b9072 Queue renaming reversal part 3: move module into place and
Georg Brandl <georg@python.org>
parents: 47241
diff changeset
416 except Queue.Empty:
29034
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
417 pass
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
418 else:
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
419 seq, response = qmsg
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
420 message = (seq, ('OK', response))
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
421 self.putmessage(message)
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
422 # poll for message on link
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
423 try:
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
424 message = self.pollmessage(wait)
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
425 if message is None: # socket not ready
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
426 return None
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
427 except EOFError:
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
428 self.handle_EOF()
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
429 return None
29034
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
430 except AttributeError:
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
431 return None
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
432 seq, resq = message
29034
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
433 how = resq[0]
27366
6147bc14d277 1. Eliminate putrequest(): only used in asynccall(), merge it there.
Kurt B. Kaiser <kbk@shore.net>
parents: 26959
diff changeset
434 self.debug("pollresponse:%d:myseq:%s" % (seq, myseq))
29034
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
435 # process or queue a request
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
436 if how in ("CALL", "QUEUE"):
27379
a457531c0fd4 M PyShell.py
Kurt B. Kaiser <kbk@shore.net>
parents: 27366
diff changeset
437 self.debug("pollresponse:%d:localcall:call:" % seq)
29034
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
438 response = self.localcall(seq, resq)
27379
a457531c0fd4 M PyShell.py
Kurt B. Kaiser <kbk@shore.net>
parents: 27366
diff changeset
439 self.debug("pollresponse:%d:localcall:response:%s"
a457531c0fd4 M PyShell.py
Kurt B. Kaiser <kbk@shore.net>
parents: 27366
diff changeset
440 % (seq, response))
29034
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
441 if how == "CALL":
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
442 self.putmessage((seq, response))
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
443 elif how == "QUEUE":
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
444 # don't acknowledge the 'queue' request!
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
445 pass
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
446 continue
29034
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
447 # return if completed message transaction
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
448 elif seq == myseq:
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
449 return resq
29034
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
450 # must be a response for a different thread:
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
451 else:
29034
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
452 cv = self.cvars.get(seq, None)
27920
8e7432cdf7d8 M NEWS.txt
Kurt B. Kaiser <kbk@shore.net>
parents: 27545
diff changeset
453 # response involving unknown sequence number is discarded,
29034
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
454 # probably intended for prior incarnation of server
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
455 if cv is not None:
29034
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
456 cv.acquire()
27920
8e7432cdf7d8 M NEWS.txt
Kurt B. Kaiser <kbk@shore.net>
parents: 27545
diff changeset
457 self.responses[seq] = resq
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
458 cv.notify()
29034
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
459 cv.release()
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
460 continue
26959
b8c72e86a12d Whitespace Normalization
Kurt B. Kaiser <kbk@shore.net>
parents: 26768
diff changeset
461
29034
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
462 def handle_EOF(self):
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
463 "action taken upon link being closed by peer"
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
464 self.EOFhook()
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
465 self.debug("handle_EOF")
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
466 for key in self.cvars:
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
467 cv = self.cvars[key]
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
468 cv.acquire()
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
469 self.responses[key] = ('EOF', None)
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
470 cv.notify()
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
471 cv.release()
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
472 # call our (possibly overridden) exit function
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
473 self.exithook()
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
474
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
475 def EOFhook(self):
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
476 "Classes using rpc client/server can override to augment EOF action"
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
477 pass
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
478
24386
0e27b67247da Reverse the RPC socket connection: Python execution server connects to
Kurt B. Kaiser <kbk@shore.net>
parents: 23995
diff changeset
479 #----------------- end class SocketIO --------------------
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
480
34212
1e8b033f91dc The remote procedure call module rpc.py can now access data attributes of
Kurt B. Kaiser <kbk@shore.net>
parents: 31515
diff changeset
481 class RemoteObject(object):
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
482 # Token mix-in class
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
483 pass
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
484
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
485 def remoteref(obj):
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
486 oid = id(obj)
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
487 objecttable[oid] = obj
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
488 return RemoteProxy(oid)
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
489
34212
1e8b033f91dc The remote procedure call module rpc.py can now access data attributes of
Kurt B. Kaiser <kbk@shore.net>
parents: 31515
diff changeset
490 class RemoteProxy(object):
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
491
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
492 def __init__(self, oid):
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
493 self.oid = oid
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
494
47241
ba1fa511b72d socketserver renaming reversal part 3: move the module into the right
Georg Brandl <georg@python.org>
parents: 47189
diff changeset
495 class RPCHandler(SocketServer.BaseRequestHandler, SocketIO):
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
496
26557
4be62dc9a3e7 M PyShell.py
Kurt B. Kaiser <kbk@shore.net>
parents: 26468
diff changeset
497 debugging = False
4be62dc9a3e7 M PyShell.py
Kurt B. Kaiser <kbk@shore.net>
parents: 26468
diff changeset
498 location = "#S" # Server
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
499
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
500 def __init__(self, sock, addr, svr):
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
501 svr.current_handler = self ## cgt xxx
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
502 SocketIO.__init__(self, sock)
47241
ba1fa511b72d socketserver renaming reversal part 3: move the module into the right
Georg Brandl <georg@python.org>
parents: 47189
diff changeset
503 SocketServer.BaseRequestHandler.__init__(self, sock, addr, svr)
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
504
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
505 def handle(self):
47241
ba1fa511b72d socketserver renaming reversal part 3: move the module into the right
Georg Brandl <georg@python.org>
parents: 47189
diff changeset
506 "handle() method required by SocketServer"
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
507 self.mainloop()
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
508
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
509 def get_remote_proxy(self, oid):
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
510 return RPCProxy(self, oid)
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
511
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
512 class RPCClient(SocketIO):
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
513
26557
4be62dc9a3e7 M PyShell.py
Kurt B. Kaiser <kbk@shore.net>
parents: 26468
diff changeset
514 debugging = False
4be62dc9a3e7 M PyShell.py
Kurt B. Kaiser <kbk@shore.net>
parents: 26468
diff changeset
515 location = "#C" # Client
4be62dc9a3e7 M PyShell.py
Kurt B. Kaiser <kbk@shore.net>
parents: 26468
diff changeset
516
24386
0e27b67247da Reverse the RPC socket connection: Python execution server connects to
Kurt B. Kaiser <kbk@shore.net>
parents: 23995
diff changeset
517 nextseq = 1 # Requests coming from the client are odd numbered
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
518
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
519 def __init__(self, address, family=socket.AF_INET, type=socket.SOCK_STREAM):
25020
e41058845b79 1. Revert subprocess environment clearing, will restart subprocess
Kurt B. Kaiser <kbk@shore.net>
parents: 25019
diff changeset
520 self.listening_sock = socket.socket(family, type)
e41058845b79 1. Revert subprocess environment clearing, will restart subprocess
Kurt B. Kaiser <kbk@shore.net>
parents: 25019
diff changeset
521 self.listening_sock.bind(address)
e41058845b79 1. Revert subprocess environment clearing, will restart subprocess
Kurt B. Kaiser <kbk@shore.net>
parents: 25019
diff changeset
522 self.listening_sock.listen(1)
24386
0e27b67247da Reverse the RPC socket connection: Python execution server connects to
Kurt B. Kaiser <kbk@shore.net>
parents: 23995
diff changeset
523
0e27b67247da Reverse the RPC socket connection: Python execution server connects to
Kurt B. Kaiser <kbk@shore.net>
parents: 23995
diff changeset
524 def accept(self):
25020
e41058845b79 1. Revert subprocess environment clearing, will restart subprocess
Kurt B. Kaiser <kbk@shore.net>
parents: 25019
diff changeset
525 working_sock, address = self.listening_sock.accept()
26768
346a07270e87 Remove debugging connection message
Kurt B. Kaiser <kbk@shore.net>
parents: 26557
diff changeset
526 if self.debugging:
27366
6147bc14d277 1. Eliminate putrequest(): only used in asynccall(), merge it there.
Kurt B. Kaiser <kbk@shore.net>
parents: 26959
diff changeset
527 print>>sys.__stderr__, "****** Connection request from ", address
29365
72ce7cc03f27 Avoid problem resolving 'localhost'
Kurt B. Kaiser <kbk@shore.net>
parents: 29254
diff changeset
528 if address[0] == LOCALHOST:
25020
e41058845b79 1. Revert subprocess environment clearing, will restart subprocess
Kurt B. Kaiser <kbk@shore.net>
parents: 25019
diff changeset
529 SocketIO.__init__(self, working_sock)
24386
0e27b67247da Reverse the RPC socket connection: Python execution server connects to
Kurt B. Kaiser <kbk@shore.net>
parents: 23995
diff changeset
530 else:
26768
346a07270e87 Remove debugging connection message
Kurt B. Kaiser <kbk@shore.net>
parents: 26557
diff changeset
531 print>>sys.__stderr__, "** Invalid host: ", address
24386
0e27b67247da Reverse the RPC socket connection: Python execution server connects to
Kurt B. Kaiser <kbk@shore.net>
parents: 23995
diff changeset
532 raise socket.error
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
533
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
534 def get_remote_proxy(self, oid):
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
535 return RPCProxy(self, oid)
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
536
34212
1e8b033f91dc The remote procedure call module rpc.py can now access data attributes of
Kurt B. Kaiser <kbk@shore.net>
parents: 31515
diff changeset
537 class RPCProxy(object):
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
538
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
539 __methods = None
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
540 __attributes = None
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
541
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
542 def __init__(self, sockio, oid):
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
543 self.sockio = sockio
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
544 self.oid = oid
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
545
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
546 def __getattr__(self, name):
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
547 if self.__methods is None:
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
548 self.__getmethods()
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
549 if self.__methods.get(name):
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
550 return MethodProxy(self.sockio, self.oid, name)
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
551 if self.__attributes is None:
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
552 self.__getattributes()
56436
684960fb1cbf replace has_key with 'in' operator
Benjamin Peterson <benjamin@python.org>
parents: 56435
diff changeset
553 if name in self.__attributes:
34212
1e8b033f91dc The remote procedure call module rpc.py can now access data attributes of
Kurt B. Kaiser <kbk@shore.net>
parents: 31515
diff changeset
554 value = self.sockio.remotecall(self.oid, '__getattribute__',
1e8b033f91dc The remote procedure call module rpc.py can now access data attributes of
Kurt B. Kaiser <kbk@shore.net>
parents: 31515
diff changeset
555 (name,), {})
1e8b033f91dc The remote procedure call module rpc.py can now access data attributes of
Kurt B. Kaiser <kbk@shore.net>
parents: 31515
diff changeset
556 return value
1e8b033f91dc The remote procedure call module rpc.py can now access data attributes of
Kurt B. Kaiser <kbk@shore.net>
parents: 31515
diff changeset
557 else:
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
558 raise AttributeError, name
29034
656493534cc7 1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents: 28386
diff changeset
559
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
560 def __getattributes(self):
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
561 self.__attributes = self.sockio.remotecall(self.oid,
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
562 "__attributes__", (), {})
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
563
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
564 def __getmethods(self):
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
565 self.__methods = self.sockio.remotecall(self.oid,
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
566 "__methods__", (), {})
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
567
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
568 def _getmethods(obj, methods):
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
569 # Helper to get a list of methods from an object
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
570 # Adds names to dictionary argument 'methods'
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
571 for name in dir(obj):
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
572 attr = getattr(obj, name)
56435
57ee0793e462 replace callable()
Benjamin Peterson <benjamin@python.org>
parents: 55552
diff changeset
573 if hasattr(attr, '__call__'):
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
574 methods[name] = 1
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
575 if type(obj) == types.InstanceType:
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
576 _getmethods(obj.__class__, methods)
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
577 if type(obj) == types.ClassType:
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
578 for super in obj.__bases__:
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
579 _getmethods(super, methods)
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
580
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
581 def _getattributes(obj, attributes):
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
582 for name in dir(obj):
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
583 attr = getattr(obj, name)
56435
57ee0793e462 replace callable()
Benjamin Peterson <benjamin@python.org>
parents: 55552
diff changeset
584 if not hasattr(attr, '__call__'):
26959
b8c72e86a12d Whitespace Normalization
Kurt B. Kaiser <kbk@shore.net>
parents: 26768
diff changeset
585 attributes[name] = 1
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
586
34212
1e8b033f91dc The remote procedure call module rpc.py can now access data attributes of
Kurt B. Kaiser <kbk@shore.net>
parents: 31515
diff changeset
587 class MethodProxy(object):
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
588
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
589 def __init__(self, sockio, oid, name):
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
590 self.sockio = sockio
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
591 self.oid = oid
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
592 self.name = name
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
593
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
594 def __call__(self, *args, **kwargs):
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
595 value = self.sockio.remotecall(self.oid, self.name, args, kwargs)
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
596 return value
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
597
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents:
diff changeset
598
30390
6a9101471ad3 Python Bug 775061
Kurt B. Kaiser <kbk@shore.net>
parents: 29365
diff changeset
599 # XXX KBK 09Sep03 We need a proper unit test for this module. Previously
55552
fcea7ba4b034 Easier reference to find (at least while svn continues being used).
Guilherme Polo <ggpolo@gmail.com>
parents: 52799
diff changeset
600 # existing test code was removed at Rev 1.27 (r34098).