ocaml/testsuite/tests/lib-threads/sieve.ml

46 lines
1.5 KiB
OCaml

(***********************************************************************)
(* *)
(* OCaml *)
(* *)
(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *)
(* *)
(* Copyright 1996 Institut National de Recherche en Informatique et *)
(* en Automatique. All rights reserved. This file is distributed *)
(* under the terms of the Q Public License version 1.0. *)
(* *)
(***********************************************************************)
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
;;