------------------------------------------------------------------------------- Mohamed G. Gouda CS 356 Summer 2006 Midterm 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, b: 0..1 rcvchk: array[N] of boolean {init. false} par g: N begin rcv chk(b) from p[g] -> if b=0 -> up[g] := false [] b=1 -> up[g] := true fi; rcvchk[g] := true [] rcvchk[g] -> send chk(1) to p[g]; rcvchk[g] := false [] rcv error from p[g] -> skip [] timeout ~rcvchk[g].p[i] ^~rcvchk[i].p[g]^(#ch.p[i].p[g] + #ch.p[g].p[i] = 0) -> if i send chk(0) to p[g] [] i>=g -> skip fi; up[g] :=false end 2. RTMSG :: if i!=x ^ j!=0 ^ up[rtb[0]] -> send data(x,y) to p[rtb[0]] [] i!=x ^ j!=0 ^ ~up[rtb[0]] -> {nonreachable} skip [] i!=x ^ j=0 ^ up[1-i,0] -> send data(x,y) to p[1-i,0] [] i!=x ^ j=0 ^ ~up[1-i,0] -> {nonreachable} skip [] i=x ^ j!=y ^ up[rtb[y]] -> send data(x,y) to p[rtb[y]] [] i=x ^ j!=y ^ up[rtb[y]] -> {nonreachable} skip [] i=x ^ j=y -> {arrived} skip fi