def receiver_loop
loop {
begin
t,mcode = read(@socket)
t,msize = read(@socket)
dputs ": receiving a message : code=#{mcode} : size=#{msize}"
msid = nil
case mcode
when M_CALL
buf = read_message_to_buffer(@socket,msize)
t,msid = read(buf)
c = CallingOject.new.build_by_receiver(msid,buf)
dputs ": received: OK : #{c.sid}"
received(c)
when M_RETURN
buf = read_message_to_buffer(@socket,msize)
t,msid = read(buf)
dputs ": sid=#{msid}"
r = build_result_object(msid,buf)
dputs ": received: RET: #{r.sid}"
@receiving_table[r.sid].push r
else
dputs ": Unknown message code. try to reset the connection."
@socket_state = :socket_closing
@sending_queue.push nil
return
end
@socket_lock.synchronize do
if @socket_state == :socket_closing then
dputs ": receiver-thread terminating..."
return
end
end
rescue Exception => evar
mes = evar.message
if msid then
r = ResultErrObject.new(msid,R_PROTOCOL_ERROR,"ResultObjectError",mes,evar.backtrace.join("\n"))
@receiving_table[msid].push r
end
dputs "[rcvloop] #{evar.to_s}"
if mes["close"] || mes["reset"] then
dputs ": [rcvloop] disconnected by remote host."
break
elsif evar.kind_of?(IOError) then
dputs ": [rcvloop] try to reset the connection."
@socket_lock.synchronize do
@socket_state = :socket_closing
end
break
else
dputs ": [rcvloop] going to recover the communication."
end
ensure
dputs ": [rcvloop]--------------"
end
}
end