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
|
(* TEST
ocamlopt_flags += " -O3 ";
*)
let flag1 = Atomic.make false
let flag2 = Atomic.make false
let rec wait_for_flag f =
if Atomic.get f then ()
else (Domain.cpu_relax (); wait_for_flag f)
let l1 = Lazy.from_fun (fun () ->
Atomic.set flag1 true;
wait_for_flag flag2)
let first_domain () =
Lazy.force l1
let second_domain () =
wait_for_flag flag1;
let l2 = Lazy.from_fun (fun () -> Lazy.force l1) in
let rec loop () =
try Lazy.force l2 with
| Lazy.Undefined -> Atomic.set flag2 true
in
loop ()
let _ =
let d = Domain.spawn first_domain in
second_domain ();
Domain.join d;
print_endline "OK"
|