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 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
|
(* TEST *)
let test_size =
try int_of_string (Sys.getenv "OCAML_TEST_SIZE")
with Not_found | Failure _ -> 0
let num_domains =
if test_size >= 2 then 100 else 14
let main_join n =
let a = Array.init n (fun _ -> false) in
Array.init n (fun i -> Domain.spawn (fun () ->
a.(i) <- true;
Some i
)) |>
Array.iteri (fun i d -> let v = Domain.join d in assert (v = Some i));
let ok = Array.to_list a |> List.for_all (fun x -> x) in
assert ok
let rec other_join flags n domain =
if n > 0 then
Domain.spawn (fun () -> flags.(n-1) <- true; Domain.join domain)
|> other_join flags (n-1)
else
Domain.join domain
let join2 () =
let r = ref false in
let t = Domain.spawn (fun () -> r := true; true) in
assert (Domain.join t);
assert !r;
assert (Domain.join t)
exception Ex of string
let join_exn () =
match Domain.(join (spawn (fun () -> raise (Ex (String.make 5 '!'))))) with
| _ -> assert false
| exception (Ex "!!!!!") -> ()
let burn () =
let rec loop l =
if List.hd l > 14 then ()
else loop (l @ l |> List.map (fun x -> x + 1))
in
loop [0];
42
let join_slow () =
assert (Domain.(join (spawn burn)) = 42)
let join3 () =
let d1 = Domain.spawn burn in
let d2 = Domain.(spawn (fun _ -> Domain.join d1)) in
assert (Domain.join d1 = 42);
assert (Domain.join d2 = 42)
let () =
main_join num_domains;
let flags = Array.make num_domains false in
other_join flags (Array.length flags) (Domain.spawn ignore);
assert (Array.for_all (fun x -> x) flags);
join2 ();
join_exn ();
join_slow ();
join3 ();
Gc.full_major ();
Gc.full_major ()
|