summaryrefslogtreecommitdiff
path: root/ocaml-binary-annot/testsuite/tests/lib-threads/sieve.ml
blob: 72e2656605ee1aa64d79fcbcc0410c2a264a35a4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
open Printf
open Thread

let rec integers n ch =
  Event.sync (Event.send ch n);
  integers (n+1) ch

let rec sieve n chin chout =
  let m = Event.sync (Event.receive chin)
  in if m mod n = 0
     then sieve n chin chout
     else Event.sync (Event.send chout m);
          sieve n chin chout

let rec print_primes ch max =
  let n = Event.sync (Event.receive ch)
  in if n > max
     then ()
     else begin
            printf "%d\n" n; flush stdout;
            let ch_after_n = Event.new_channel ()
            in Thread.create (sieve n ch) ch_after_n;
               print_primes ch_after_n max
          end

let go max =
  let ch = Event.new_channel ()
  in Thread.create (integers 2) ch;
     print_primes ch max;;

let _ = go 1000

;;