blob: d4cdd447e1e26c4f9a30fc9f42e7de727982d50d (
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
(* TEST
script = "sh ${test_source_directory}/test-runtime-cleanup.sh"
* hassysthreads
include systhreads
** script
*** bytecode
output = "${test_build_directory}/program-output"
stdout = "${output}"
*** native
output = "${test_build_directory}/program-output"
stdout = "${output}"
*)
(* This test is skipped in "runtime cleanup at exit" mode
(OCAMLRUNPARAM contains c=1) because the cleanup in the main thread
destroys condition variables that are waited for by other threads,
causing a deadlock on some systems. *)
let sieve primes =
Event.sync (Event.send primes 2);
let integers = Event.new_channel () in
let rec enumerate n =
Event.sync (Event.send integers n);
enumerate (n + 2)
and filter input =
let n = Event.sync (Event.receive input)
and output = Event.new_channel () in
Event.sync (Event.send primes n);
ignore(Thread.create filter output);
(* We remove from the output the multiples of n *)
while true do
let m = Event.sync (Event.receive input) in
(* print_int n; print_string ": "; print_int m; print_newline(); *)
if m mod n <> 0 then Event.sync (Event.send output m)
done in
ignore(Thread.create filter integers);
ignore(Thread.create enumerate 3)
let primes = Event.new_channel ()
let _ =
ignore(Thread.create sieve primes);
for i = 1 to 50 do
let n = Event.sync (Event.receive primes) in
print_int n; print_newline()
done
|