procedure main(A) fName := A[1]|"index.txt" p := thread produce(fName) c := thread consume(p) every wait(p | c) end procedure produce(fName) every !open(fName)@>> # drop messages in p's outbox (blocking whenever box is full) @>> # Signal consumer that p is done write("count is ",<<@) # block until message in p's inbox end procedure consume(p) i := 0 while write(\<<@p) do (i+:=1) # loop until empty message in p's outbox # (blocking until each message arrives) i@>>p # put row count into p's inbox end