21
21
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22
22
# OTHER DEALINGS IN THE SOFTWARE.
24
import marshal, os, struct
24
import marshal, os, struct, threading
25
25
from pushy.protocol.message import Message, MessageType
26
26
from pushy.protocol.proxy import Proxy, ProxyType, get_opmask
53
54
def __init__(self, istream, ostream, initiator=True):
54
55
self.__logfile = None
55
56
self.__istream = istream
56
57
self.__ostream = ostream
57
58
self.__initiator = initiator
59
self.__lock = threading.RLock()
59
61
# Uncomment the following for debugging.
60
62
#self.__logfile = open("pushy.%d.log" % os.getpid(), "w")
61
#self.__istream = LoggingFile(istream, open("%d.in" % os.getpid(), "wb"))
62
#self.__ostream = LoggingFile(ostream, open("%d.out" % os.getpid(), "wb"))
63
#self.__istream = LoggingFile(istream, open("%d.in"%os.getpid(),"wb"))
64
#self.__ostream = LoggingFile(ostream, open("%d.out"%os.getpid(),"wb"))
64
66
self.__outstandingRequests = 0
65
67
# (Client) Contains mapping of id(obj) -> proxy
77
79
self.__handle(self.__recv())
79
81
def eval(self, expression):
80
expression = self.__marshal(expression)
81
self.__outstandingRequests += 1
82
self.__send(Message(MessageType.evaluate, expression))
83
return self.__waitForResponse()
84
expression = self.__marshal(expression)
85
self.__outstandingRequests += 1
86
self.__send(Message(MessageType.evaluate, expression))
87
return self.__waitForResponse()
85
91
def operator(self, type_, id_, args, kwargs):
86
parameters = self.__marshal((id_, args, kwargs))
87
self.__outstandingRequests += 1
88
self.__send(Message(type_, parameters))
89
return self.__waitForResponse()
94
parameters = self.__marshal((id_, args, kwargs))
95
self.__outstandingRequests += 1
96
self.__send(Message(type_, parameters))
97
return self.__waitForResponse()
91
101
def getattr(self, id_, name):
92
parameters = self.__marshal((id_, name))
93
self.__outstandingRequests += 1
94
self.__send(Message(MessageType.getattr, parameters))
95
return self.__waitForResponse()
102
self.__lock.acquire()
104
parameters = self.__marshal((id_, name))
105
self.__outstandingRequests += 1
106
self.__send(Message(MessageType.getattr, parameters))
107
return self.__waitForResponse()
109
self.__lock.release()
97
111
def setattr(self, id_, name, value):
98
parameters = self.__marshal((id_, name, value))
99
self.__outstandingRequests += 1
100
self.__send(Message(MessageType.setattr, parameters))
101
return self.__waitForResponse()
112
self.__lock.acquire()
114
parameters = self.__marshal((id_, name, value))
115
self.__outstandingRequests += 1
116
self.__send(Message(MessageType.setattr, parameters))
117
return self.__waitForResponse()
119
self.__lock.release()
103
121
def getstr(self, id_):
104
self.__outstandingRequests += 1
105
self.__send(Message(MessageType.getstr, self.__marshal(id_)))
106
return self.__waitForResponse()
122
self.__lock.acquire()
124
self.__outstandingRequests += 1
125
self.__send(Message(MessageType.getstr, self.__marshal(id_)))
126
return self.__waitForResponse()
128
self.__lock.release()
108
130
def getrepr(self, id_):
109
self.__outstandingRequests += 1
110
self.__send(Message(MessageType.getrepr, self.__marshal(id_)))
111
return self.__waitForResponse()
131
self.__lock.acquire()
133
self.__outstandingRequests += 1
134
self.__send(Message(MessageType.getrepr, self.__marshal(id_)))
135
return self.__waitForResponse()
137
self.__lock.release()
113
139
def __waitForResponse(self):