summaryrefslogtreecommitdiff
path: root/testsuite/tests/lazy/lazy6.ml
blob: 098848769a9ddb3f983e23a5aa56dbcf83e6f378 (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
(* 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"