resource bounded_buffer op deposit(item : real), fetch() returns item : real body bounded_buffer(size : int) var buf[0:size-1] : real, outof : int := 0, into : int := 0 sem elements := 0, spaces := size proc deposit(item) P(spaces); buf[into] := item; into := (into+1)%size; V(elements) end deposit proc fetch() returns item P(elements); item := buf[outof]; outof := (outof+1)%size; V(spaces) end fetch end bounded_buffer resource pipeline() import bounded_buffer var ABbb, BCbb : cap bounded_buffer ABbb := create bounded_buffer(5); BCbb := create bounded_buffer(5) var limit : int := 10; getarg(1, limit) process A var work : real fa i := 1 to limit -> work := random() write("A work", i, "=", work) work := sqrt(work); nap(int(random(2000))) ABbb.deposit(work) af end A process B var work : real fa i := 1 to limit -> work := ABbb.fetch() work := sin(work); nap(int(random(2000))) write(" B work", i, "=", work) BCbb.deposit(work) af end B process C var work : real fa i := 1 to limit -> work := BCbb.fetch() work := work * work; nap(int(random(2000))) write(" C work", i, "=", work) af end C end pipeline /* ............... Example compile and run(s) % sr -v; sr -o pipeline pipeline.sr MultiSR version 2.3, October 1994 % ./pipeline A work 1 = 0.161535 A work 2 = 0.941385 A work 3 = 0.0920072 B work 1 = 0.391181 A work 4 = 0.0113099 C work 1 = 0.153022 A work 5 = 0.762952 A work 6 = 0.0378161 B work 2 = 0.825027 B work 3 = 0.298697 B work 4 = 0.106148 B work 5 = 0.766563 A work 7 = 0.507579 C work 2 = 0.680670 A work 8 = 0.418546 A work 9 = 0.740509 C work 3 = 0.0892199 C work 4 = 0.0112674 B work 6 = 0.193240 B work 7 = 0.653687 B work 8 = 0.602757 A work 10 = 0.886211 C work 5 = 0.587618 B work 9 = 0.758187 C work 6 = 0.0373419 C work 7 = 0.427306 B work 10 = 0.808376 C work 8 = 0.363316 C work 9 = 0.574848 C work 10 = 0.653471 % setenv SR_PARALLEL 4 % ./pipeline A work 1 = 0.263192 A work 2 = 0.000536522 A work 3 = 0.168599 B work 1 = 0.490812 B work 2 = 0.0231609 C work 1 = 0.240897 A work 4 = 0.942503 C work 2 = 0.000536426 B work 3 = 0.399167 A work 5 = 0.333928 A work 6 = 0.414772 C work 3 = 0.159334 A work 7 = 0.908196 B work 4 = 0.825352 C work 4 = 0.681207 B work 5 = 0.546237 A work 8 = 0.815700 B work 6 = 0.600422 A work 9 = 0.364226 C work 5 = 0.298375 C work 6 = 0.360506 B work 7 = 0.815153 A work 10 = 0.681134 B work 8 = 0.785288 C work 7 = 0.664474 C work 8 = 0.616677 B work 9 = 0.567537 C work 9 = 0.322099 B work 10 = 0.734757 C work 10 = 0.539868 */