File: stress_semaphore.ml

package info (click to toggle)
ocaml-eio 1.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 2,548 kB
  • sloc: ml: 14,608; ansic: 1,237; makefile: 25
file content (38 lines) | stat: -rw-r--r-- 1,085 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
open Eio.Std

(* Three domains fighting over 2 semaphore tokens,
   with domains cancelling if they don't get served quickly. *)

let n_domains = 3
let n_tokens = 2
let n_iters = 100_000

let main ~domain_mgr =
  let sem = Eio.Semaphore.make n_tokens in
  Switch.run (fun sw ->
      for _ = 1 to n_domains do
        Fiber.fork ~sw (fun () ->
            Eio.Domain_manager.run domain_mgr (fun () ->
                let i = ref 0 in
                while !i < n_iters do
                  let got = ref false in
                  Fiber.first
                    (fun () -> Eio.Semaphore.acquire sem; got := true)
                    (fun () -> Fiber.yield ());
                  if !got then (
                    incr i;
                    Eio.Semaphore.release sem;
                  ) else (
                    (* traceln "yield" *)
                  )
                done
              )
          )
      done;
    );
  assert (Eio.Semaphore.get_value sem = n_tokens);
  print_endline "OK"

let () =
  Eio_main.run @@ fun env ->
  main ~domain_mgr:(Eio.Stdenv.domain_mgr env)