Source file domain_manager.ml

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

let id = Fiber.create_key ()

let with_domain_tracing fn =
  Eio.Debug.with_trace_prefix (fun f ->
      Fiber.get id |> Option.iter (fun id -> Fmt.pf f "[%s] " id)
    ) fn

module Fake_domain_mgr = struct
  type t = {
    mutable next_domain_id : int;
  }

  let create () = { next_domain_id = 1 }

  let run t fn =
    let self = t.next_domain_id in
    t.next_domain_id <- t.next_domain_id + 1;
    let cancelled, _ = Promise.create () in
    Fiber.with_binding id (string_of_int self)
      (fun () -> fn ~cancelled)

  let run_raw t fn =
    let self = t.next_domain_id in
    t.next_domain_id <- t.next_domain_id + 1;
    Fiber.with_binding id (string_of_int self) fn
end

let create =
  let handler = Eio.Domain_manager.Pi.mgr (module Fake_domain_mgr) in
  fun () -> Eio.Resource.T (Fake_domain_mgr.create (), handler)

let run fn =
  let dm = create () in
  with_domain_tracing @@ fun () ->
  Fiber.with_binding id "0" @@ fun () ->
  fn dm