Class: Pione::DRbPatch::PioneDRbMessage
- Inherits:
-
DRb::DRbMessage
- Object
- DRb::DRbMessage
- Pione::DRbPatch::PioneDRbMessage
- Defined in:
- lib/pione/patch/drb-patch.rb
Overview
+PioneDRbMessage+ is a special protocol for +PioneTCPSocket+.
Instance Method Summary collapse
-
#initialize(*args) ⇒ PioneDRbMessage
constructor
A new instance of PioneDRbMessage.
-
#recv_reply(stream) ⇒ Object
Receive a reply(request id, succ, and result) from the stream.
-
#recv_request(stream) ⇒ Object
Receive request from the stream.
-
#send_reply(req_id, stream, succ, result) ⇒ Object
Send the reply.
-
#send_request(stream, ref, msg_id, arg, b) ⇒ Object
Send a request to the stream.
Constructor Details
#initialize(*args) ⇒ PioneDRbMessage
Returns a new instance of PioneDRbMessage.
111 112 113 114 115 116 117 |
# File 'lib/pione/patch/drb-patch.rb', line 111 def initialize(*args) @send_request_lock = Mutex.new @recv_request_lock = Mutex.new @send_reply_lock = Mutex.new @recv_reply_lock = Mutex.new super end |
Instance Method Details
#recv_reply(stream) ⇒ Object
Receive a reply(request id, succ, and result) from the stream.
199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 |
# File 'lib/pione/patch/drb-patch.rb', line 199 def recv_reply(stream) Log::Debug.communication do "client tries to receive a reply... (fd: %s)" % stream.to_i end @recv_reply_lock.synchronize do req_id = load(stream) succ = load(stream) result = load(stream) Log::Debug.communication( "client received a reply (fd: %s, req_id: %s)" % [stream.to_i, req_id] ) return req_id, succ, result end end |
#recv_request(stream) ⇒ Object
Receive request from the stream. See +ClientReuqest+.
145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 |
# File 'lib/pione/patch/drb-patch.rb', line 145 def recv_request(stream) Log::Debug.communication "server tries to receive a request... (fd: %s)" % stream.to_i @recv_request_lock.synchronize do # read requst id, object id, method name, and arguments size req_id = load(stream) ref = load(stream) msg_id = load(stream) argc = load(stream) Log::Debug.communication do "server received a request (fd: %s, req_id: %s, ref: %s, msg_id: %s)" % [stream.to_i, req_id, ref.to_s, msg_id] end # check arguement size raise DRb::DRbConnError.new("too many arguments") if @argc_limit < argc ro = nil available = true # refer to object begin ro = DRb.to_obj(ref) rescue RangeError => e Log::Debug.system("bad object id \"%s\" is referred (msg_id: %s)" % [ref, msg_id]) available = false end # build arguments argv = Array.new(argc, nil) argc.times {|n| argv[n] = load(stream)} # read block block = load(stream) return req_id, ro, msg_id, argv, block, available end end |
#send_reply(req_id, stream, succ, result) ⇒ Object
Send the reply.
185 186 187 188 189 190 191 192 193 194 195 196 |
# File 'lib/pione/patch/drb-patch.rb', line 185 def send_reply(req_id, stream, succ, result) Log::Debug.communication { "server sends a reply (fd: %s, req_id: %s, result: %s)" % [stream.to_i, req_id, result] } # build a reply data data = dump(req_id) + dump(succ) + dump(result, !succ) @send_reply_lock.synchronize {stream.write(data)} rescue raise DRb::DRbConnError, $!., $!.backtrace end |
#send_request(stream, ref, msg_id, arg, b) ⇒ Object
Send a request to the stream. This is different from original at the point that patched version has request id.
121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 |
# File 'lib/pione/patch/drb-patch.rb', line 121 def send_request(stream, ref, msg_id, arg, b) # generate a new request id req_id = Util::UUID.generate_int # show debug message Log::Debug.communication do "client sends a request %s#%s (fd: %s, req_id: %s)" % [ref.__drburi, msg_id, stream.to_i, req_id] end # make a dumped request sequece(request id, ref, msg_id, argc, argv, b) data = [ req_id, ref.__drbref, msg_id.id2name, arg.length, *arg, b ].map{|elt| dump(elt)}.join('') @send_request_lock.synchronize {stream.write(data)} return req_id rescue => e Log::Debug.communication "following error happened while we send request" Log::Debug.communication e raise DRb::DRbConnError.new, $!., $!.backtrace end |