------------------------------------------------------------------------------- Mohamed G. Gouda CS 356 Fall 2005 Homework 1 Solution ------------------------------------------------------------------------------- 1. Process p can be defined as follows: process p var ready : boolean {true, initially} begin ready -> send rqst to q; ready := false [] rcv rply from q -> ready := true [] rcv rqst from q -> if ready -> send rqst to q; ready := false [] ~ready -> skip fi; send rply to q; end ------------------------------------------------------------------------------- 2. Process c can be defined as follows: process c const n,s var avail : array [0..s-1] of boolean, {avail[k]=true where 0<=k if avail[r] -> send grant(r) to u[j]; avail[r] := false []~avail[r] -> bff[r,nr[r]] := j; nr[r] := nr[r] +n 1 fi [] rcv rls(r) from u[j] -> if ns[r] = nr[r] -> avail[r] := true [] ns[r] != nr[r] -> send grant(r) to u[bff[r,ns[r]]]; ns[r] := ns[r] +n 1 fi end ------------------------------------------------------------------------------- 3. process p var ready : boolean begin ready -> {send two new data messages} ready := false; send data(0) to q; send data(1) to q [] rcv ack from q -> ready := true [] timeout (~ready ^ #ch.p.q+#ch.q.p=0) -> {resend data messages} send data(0) to q; send data(1) to q end process q var exp : 0 .. 1, {0, initially} i : 0 .. 1 begin rcv data(i) from p -> if exp=i -> {accept data(i)} if exp=1 -> send ack to p [] exp~=1 -> skip fi; exp := exp +2 1 [] exp~=i -> {discard data(i)} skip fi [] rcv error -> skip end ------------------------------------------------------------------------------- 4. The timeout guard G can be defined as follows: wait ^ (#ch.p.q+#ch.q.p=0)