def receiver_loop
loop {
begin
t,mcode = read(@socket)
dputs ": receiving a message : code=#{mcode}"
msid = nil
case mcode
when M_CALL
t,msid = read(@socket)
c = CallingOject.new.build_by_receiver(msid,@socket)
dputs ": received: OK : #{c.sid}"
received(c)
when M_RETURN
t,msid = read(@socket)
r = ResultObject.new.build_by_receiver(msid,@socket)
dputs ": received: RET: #{r.sid}"
@receiving_lock.synchronize do
@receiving_table[r.sid] = r
@receiving_waiter.broadcast
end
dputs ": receiving_waiter.broadcast"
else
dputs ": Unknown message code. try to reset the connection."
@socket_lock.synchronize do
@socket_state = :socket_closing
end
@sending_lock.synchronize do
@sending_waiter.broadcast
end
return
end
@socket_lock.synchronize do
if @socket_state == :socket_closing then
dputs ": receiver-thread terminating..."
return
end
end
rescue => evar
mes = evar.message
if msid then
@receiving_lock.synchronize do
r = ResultObject.new.build_by_sender_error(msid,R_PROTOCOL_ERROR,"ResultObjectError",mes,evar.backtrace.join("\n"))
@receiving_table[msid] = r
@receiving_waiter.broadcast
end
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
end
}
end