------------------------------------------------------------------------------- Mohamed G. Gouda CS 356 Summer 2007 Homework 1 Solution ------------------------------------------------------------------------------- 1. (3 Points): process p[0] var ready : boolean {init. true} par g : 1..3 begin ready -> send rqst to p[1]; ready := false [] rcv rply from p[g] -> ready := true end process p[i : 1..3] begin rcv rqst from p[i-1] -> if i<3 -> send rqst to p[i+1] [] true -> send rply to p[0] fi end ------------------------------------------------------------------------------- 2. (3 Points): * Add the following two actions to process p[0]: rcv error from p[g] -> skip [] timeout G -> ready := true Where G is the following protocol predicate: ~ready ^ ( #ch.p[0].p[1] + #ch.p[1].p[2] + #ch.p[2].p[3] + #ch.p[1].p[0] + #ch.p[2].p[0] + #ch.p[3].p[0] = 0) * Add the following action to process p[i : 1..3] rcv error from p[i-1] -> skip ------------------------------------------------------------------------------- 2. (4 Points): process p[i : 0..n-1] inp N : set {g| p[g] is a neigbor of p[i]} var S : boolean, e : boolean, g : N par j : N begin ~s ^ ~e -> s, g := true, any; send rqst to p[g] [] rcv no from p[g] -> s := false [] rcv yes from p[g] -> e:= true [] s ^ e -> send done to p[g]; s, e := false, false [] rcv done from p[g] -> e:= false [] rcv rqst from p[j] -> if s V e -> send no to p[j] [] ~s ^ ~e -> send yes to p[j]; e := true fi end