------------------------------------------------------------------------------- Mohamed G. Gouda CS 356 Summer 2006 Homework 3 Solution ------------------------------------------------------------------------------- 1. process p[i:0..n-1] inp N: set{g|p[g] is a neighbor of p[i]} var up: array[N] of boolean, ready: array[N] of boolean {init true} par g: N begin ready[g] -> ready[g]; = false; send chkrqst to p[g] [] rcv chkrply from p[g] -> up[g], ready[g] := true,true [] rcv chkrqst from p[g] -> send chkrply to p[g] [] timeout ~ready[g].p[i] ^ (#ch.p[i].p[g] + #ch.p[g].p[i] = 0) ->up[g], ready[g] := false,true end 2. process p[i:0..n-1] inp N: set{g|p[g] is a neighbor of p[i]} var up: array[N] of boolean, b: 0..1, x,y,sum: integer isum: array[N] of integer begin rcv chk(b,x,y,sum) from p[g] -> if b=0 v sum != isum[g] -> up[g] :=false [] b=1 ^ sum = isum[g] -> up[g] :=true fi; sum := x+y; x, y := any,any; isum[g] := x+y; send chk(1,x,y,sum) to p[g] [] rcv error from p[g] -> skip [] timeout (#ch.p[i].p[g] + #ch.p[g].p[i] = 0) -> up[g]]:= false; if i x,y := any,any; isum[g] := x+y; send chk(0,x,y,sum) to p[g] [] i>= -> skip fi end 3. process p[0] const n inp up: array[1..n-1] of boolean var ts : integer, {init. 0} m : 1..n, begin true -> ts, m := ts+1,1; do m if up[m] -> send st(up,ts) to p[m]; []~up[m] -> skip fi; m := m+1 od end process p[i:1..n-1] var vp,v: array [1..n-1] of boolean, ts,t: integer {initially ts=0} begin rcv st( v,t) from p[0] -> if t<= ts -> skip [] t>ts -> ts,vp := t,v fi end