resource parallel_sieve() optype pipe(number : int) const N := 8 var n : int := N; getarg(1, n) var debug : bool := false; getarg(2, debug) if n < 1 -> write("Generate at least one prime number."); stop(1) fi op sieve[1:n] : pipe var seen_count[1:n] : int := ([n] 1) write("age()=", age(), "generating the first", n, "prime numbers greater than 2") process filter(i := 1 to n) var prime, number : int receive sieve[i](prime) write("filter", i, "received prime", prime) if (i = n) -> write("age()=", age(), "done"); stop [] else -> do true -> receive sieve[i](number) seen_count[i]++ if number % prime != 0 -> send /* don't call */ sieve[i+1](number) [] debug -> writes(" *debug* filter ", i, " discarding ", number, " (divisible by ", prime, ")\n") fi od fi end filter var number : int := 3 do true -> call /* don't send */ sieve[1](number) if debug -> write(" *debug* driver sent", number, "to filter 1") fi number +:= 2 od final write("the filters each saw the following counts of numbers") fa i := 1 to n -> writes(" ", seen_count[i]) af writes("\n") end final end parallel_sieve /* ............... Example compile and run(s) % sr -o parallel_sieve parallel_sieve.sr % ./parallel_sieve 8 true age()= 12 generating the first 8 prime numbers greater than 2 filter 1 received prime 3 *debug* driver sent 3 to filter 1 *debug* driver sent 5 to filter 1 filter 2 received prime 5 *debug* driver sent 7 to filter 1 *debug* filter 1 discarding 9 (divisible by 3) filter 3 received prime 7 *debug* driver sent 9 to filter 1 *debug* driver sent 11 to filter 1 filter 4 received prime 11 *debug* driver sent 13 to filter 1 *debug* filter 1 discarding 15 (divisible by 3) *debug* driver sent 15 to filter 1 filter 5 received prime 13 *debug* driver sent 17 to filter 1 filter 6 received prime 17 *debug* driver sent 19 to filter 1 *debug* filter 1 discarding 21 (divisible by 3) *debug* driver sent 21 to filter 1 filter 7 received prime 19 *debug* driver sent 23 to filter 1 filter 8 received prime 23 age()= 155 done *debug* driver sent 25 to filter 1 *debug* filter 2 discarding 25 (divisible by 5) the filters each saw the following counts of numbers 12 8 6 5 4 3 2 1 % ./parallel_sieve 40 age()= 12 generating the first 40 prime numbers greater than 2 filter 1 received prime 3 filter 2 received prime 5 filter 3 received prime 7 filter 4 received prime 11 filter 5 received prime 13 filter 6 received prime 17 filter 7 received prime 19 filter 8 received prime 23 filter 9 received prime 29 filter 10 received prime 31 filter 11 received prime 37 filter 12 received prime 41 filter 13 received prime 43 filter 14 received prime 47 filter 15 received prime 53 filter 16 received prime 59 filter 17 received prime 61 filter 18 received prime 67 filter 19 received prime 71 filter 20 received prime 73 filter 21 received prime 79 filter 22 received prime 83 filter 23 received prime 89 filter 24 received prime 97 filter 25 received prime 101 filter 26 received prime 103 filter 27 received prime 107 filter 28 received prime 109 filter 29 received prime 113 filter 30 received prime 127 filter 31 received prime 131 filter 32 received prime 137 filter 33 received prime 139 filter 34 received prime 149 filter 35 received prime 151 filter 36 received prime 157 filter 37 received prime 163 filter 38 received prime 167 filter 39 received prime 173 filter 40 received prime 179 age()= 2074 done the filters each saw the following counts of numbers 90 60 48 40 37 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 */