Tuesday, February 3, 2009

Ch5, Ex1

Interleaving is in lockstep.

Message sequence sent is
ping(0) pong(100000) pong(1) ping(100001) ping(2) pong(100002)...

because we first send ping(0) and then immediately pong(100000),
processing of first msg sends pong(1) and processing of second msg
sends ping(100001) and this goes on....

its possible to see by running following code:
declare [QTk]={Module.link [ 'x-oz://system/wp/QTk.ozf']}
declare
proc {NewPortObjects ?AddPortObject ?Call}
Sin P={NewPort Sin}
proc {MsgLoop S1 Procs}
case S1
of msg(I M)|S2 then
try {Procs.I M} catch _ then skip end
{MsgLoop S2 Procs}
[] add(I Proc Sync)|S2 then Procs2 in
Procs2={AdjoinAt Procs I Proc}
Sync=unit
{MsgLoop S2 Procs2}
[] nil then skip end
end
in
proc {AddPortObject I Proc}
Sync in
{Send P add(I Proc Sync)}
{Wait Sync}
end
proc {Call I M}
{Send P msg(I M)}
end
thread {MsgLoop Sin procs} end
end
fun {NewProgWindow CheckMsg}
InfoHdl See={NewCell true}
H D=td(label(text:nil handle:InfoHdl)
checkbutton(
text:CheckMsg handle:H init:true
action:proc {$} See:={H get($)} end))
in
{{QTk.build D} show}
proc {$ Msg}
if @See then {Delay 50} {InfoHdl set(text:Msg)} end
end
end

declare AddPortObject Call
{NewPortObjects AddPortObject Call}
InfoMsg={NewProgWindow "See ping-pong"}
fun {PingPongProc Other}
proc {$ Msg}
case Msg
of ping(N) then
{InfoMsg "ping("#N#")"}
{Delay 1000}
{Call Other pong(N+1)}
[] pong(N) then
{InfoMsg "pong("#N#")"}
{Delay 1000}
{Call Other ping(N+1)}
end
end
end
{AddPortObject pingobj {PingPongProc pongobj}}
{AddPortObject pongobj {PingPongProc pingobj}}
{Call pingobj ping(0)}
{Call pongobj pong(100000)}

No comments:

Post a Comment