File: test.ml

package info (click to toggle)
ocaml-domain-local-await 1.0.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 212 kB
  • sloc: ml: 156; sh: 59; makefile: 3
file content (44 lines) | stat: -rw-r--r-- 1,017 bytes parent folder | download
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
let[@poll error] [@inline never] push_atomically r before after =
  !r == before
  && begin
       r := after;
       true
     end

let rec push r x =
  let before = !r in
  let after = x :: before in
  if not (push_atomically r before after) then push r x

let test_all_threads_are_woken_up () =
  let n = ref 2 in

  let barrier = Domain_local_await.prepare_for_await () in

  let awaiters = ref [] in

  let threads =
    List.init !n @@ fun _ ->
    ()
    |> Thread.create @@ fun () ->
       let t = Domain_local_await.prepare_for_await () in
       push awaiters t.release;
       decr n;
       if !n = 0 then barrier.release ();
       t.await ()
  in

  barrier.await ();

  !awaiters |> List.iter (fun awaiter -> awaiter ());

  threads |> List.iter Thread.join

let basics () =
  test_all_threads_are_woken_up ();
  Domain_local_await.per_thread (module Thread);
  test_all_threads_are_woken_up ()

let () =
  Alcotest.run "Domain_local_await"
    [ ("basics", [ Alcotest.test_case "" `Quick basics ]) ]