------------------------------------------------------------------------------- Mohamed G. Gouda CS 356 Spring 2008 Homework 2 Solution ------------------------------------------------------------------------------- 1. (5 points) process q var rcvd : array [integer] of integer d : integer, {rcvd data} x : integer, {points to where to store next first data init. 0} y : integer, {points to where to store next second data init. 1} z : integer, {points to where to store next third data init. 2} begin rcv first(d) from p -> rcvd[x], x := d, x+3 [] rcv second(d) from p -> rcvd[y], y := d, y+3 [] rcv third(d) from p -> rcvd[z], z := d, z+3 end ------------------------------------------------------------------------------- 2. (5 points) process p[i : 0..x-1] const y inp m : integer var conp : boolean, {init. false} cansnd : 0..m, peer : 0..y-1 begin timeout ~conp ^ (for all j: 0<=j peer := any; send crqst to q[peer] [] rcv crply from q[peer] -> conp, cansnd := true, m [] conp -> if cansnd > 0 -> send data to q[peer]; cansnd := cansnd - 1 [] true -> send drqst to q[peer]; cansnd := 0 fi [] rcv drply from q[peer] -> conp := false end process q[j : 0..y-1] const x var conq : boolean, {init. false} peer : 0..x-1 par i : 0..x-1 begin rcv crqst from p[i] -> if true -> conq := false; send drply to p[i] [] ~conq v peer=i -> conq, peer := true, i; send crply to p[i] fi [] conq -> conq := false [] rcv data from p[i] -> if conq ^ peer = i -> {accept data} skip []~conq v peer != i -> {discard data} send drply to p[i] fi [] rcv drqst from p[i] -> if peer != i -> skip [] peer = i -> conq := false fi; send drply to p[i] end -------------------------------------------------------------------------------