------------------------------------------------------------------------------- Mohamed G. Gouda CS 356 Spring 2008 Homework 3 Solution ------------------------------------------------------------------------------- 1. (5 points) process p inp w : integer var na, nr, ns, i, j : integer {init. 0} akn : boolean {init. false} begin na + w > ns -> send data(ns, nr) to q; ns, akn := ns + 1, false [] rcv ack(j) from q -> na := max(j, na) [] timeout na < ns ^ (#ch.p.q + #ch.q.p = 0) ^ ~akn -> send data(na, nr) to q; akn := false [] rcv data(i, j) from q -> if i < nr -> akn := true [] i = nr -> {accept data(i,j)} nr, akn := nr+1, true [] i > nr -> {discard data(i,j)} skip fi; na := max(j, na) [] akn -> akn := false; send ack(nr) to q [] rcv error from q -> skip end ------------------------------------------------------------------------------- 2. (5 points) process p[i : 0..x-1] const lmax inp N : set {g | p[g] is a neighbor of p[i]} load : 0..(lmax-1) var ld : array [N] of 0..lmax, b : 0..1, d : 0..(lmax-1) par g : N begin rcv chk(b, d) from p[g] -> if b = 0 -> ld[g] := max [] b = 1 -> ld[g] := d fi; send chk(1, load) to p[g] [] rcv error from p[g] -> skip [] timeout (#ch.p[i].p[g] + #ch.p[g].p[i]=0) -> ld[g] := lmax; if i < g -> send chk(0, load) to p[g] [] i >= g -> skip fi end -------------------------------------------------------------------------------