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
|
(* TEST
include unix;
hasunix;
{ bytecode; } { native; }
*)
open Domain
(* This test looks to spawn domains while doing a bunch of explicit
minor and major GC calls from parallel domains *)
let test_size =
try int_of_string (Sys.getenv "OCAML_TEST_SIZE")
with Not_found | Failure _ -> 2
let (list_size, num_domains) =
if test_size >= 2 then (14, 25) else (13, 12)
let rec burn l =
if List.hd l > list_size then ()
else
burn (l @ l |> List.map (fun x -> x + 1))
let test_parallel_spawn () =
Array.init num_domains (fun _ -> Domain.spawn (fun () -> burn [0]))
|> Array.iter join
let () =
let running = Atomic.make true in
let rec run_until_stop fn () =
while Atomic.get running do
fn ();
done
in
let domain_minor_gc =
Domain.spawn (run_until_stop (fun () -> burn [8]; Gc.minor ()))
in
let domain_major_gc =
Domain.spawn (run_until_stop (fun () -> burn [8]; Gc.major ()))
in
let domain_parallel_spawn = Domain.spawn test_parallel_spawn in
Unix.sleep 3;
Atomic.set running false;
join domain_minor_gc;
join domain_major_gc;
join domain_parallel_spawn;
print_endline "ok"
|