------------------------------------------------------------------------------- Mohamed G. Gouda CS 356 Summer 2006 Homework 2 Solution ------------------------------------------------------------------------------- 1. process p inp m : integer {m>0} var conp: boolean, cansnd : 0..m begin timeout ~conp ^ (#ch.p.q + #ch.q.p) -> send crqst to p [] rcv crply from q -> conp, cansnd := true, m [] conp -> if cansnd > 0 -> send data to q; cansnd := cansnd - 1 [] true -> send drqst to q; cansnd := 0; fi [] rcv fin from q -> conp := false [] rcv rst from q -> conp := false end process q var conq : boolean {false} sntrst : boolean {false} begin rcv crqst from p -> if true -> conq, sndrst := true, false; send crply to p [] true -> conp:=false, send rst to p fi [] conq -> conq := false; sndrst := true [] rcv data from p -> if ~conp -> {discard data msg} send rst to p [] conq -> {store data msg} skip fi [] rcv drqst from p -> if conq -> conp := false; send fin to p [] ~ conp ^ ~sndrst -> send fin to p [] ~ conp ^ sndrst -> send rst to p fi end 2. Process p[i] is as same as process p in the textbook. process q const n var conq : boolean {false} pid : 0..n-1 sq : integer x,y : integer par i: 0..n-1 begin rcv crqst(x) from p[i] -> if ~conq -> conq, pid, y := true, i, sq; send crply(x,y) to p[i] [] ~conq -> conq, sq, y := false, sq+1, sq send drply(x, y) to p[i] [] conq ^ pid = i -> y:=sq; send crply(x,y) to p[i] [] conq ^ pid != i -> y:=sq; send drply(x,y) to p[i] fi [] conq -> conq, sq := false, sq + 1 [] rcv data(x,y) from p[i] -> if sq!= y V pid != i -> {discard data msg} send drply(x,y) to p[i] [] sq = y ^ pid = i -> {store data msg} skip fi [] rcv drqst(x, y) from p[i] -> if sq!= y V pid != i -> skip; [] sq = y ^ pid = i -> conq, sq:= false, sq+1; send drply(x,y) to p[i] fi; end 3. (m+1) * n According to the definition of corruption burst, the longest corruption burst happens when the first bit in the m*n block and the last bit in the n parity bits corrupt.