mirror of
https://github.com/c-cube/moonpool.git
synced 2025-12-11 21:48:46 -05:00
48 lines
1.4 KiB
OCaml
48 lines
1.4 KiB
OCaml
open Types_
|
|
|
|
open struct
|
|
module FLS = Picos.Fiber.FLS
|
|
end
|
|
|
|
(** A local hmap, inherited in children fibers *)
|
|
let k_local_hmap : Hmap.t FLS.t = FLS.create ()
|
|
|
|
(** Access the local [hmap], or an empty one if not set *)
|
|
let[@inline] get_local_hmap () : Hmap.t =
|
|
let fiber = get_current_fiber_exn () in
|
|
FLS.get fiber ~default:Hmap.empty k_local_hmap
|
|
|
|
let[@inline] set_local_hmap (h : Hmap.t) : unit =
|
|
let fiber = get_current_fiber_exn () in
|
|
FLS.set fiber k_local_hmap h
|
|
|
|
let[@inline] update_local_hmap (f : Hmap.t -> Hmap.t) : unit =
|
|
let fiber = get_current_fiber_exn () in
|
|
let h = FLS.get fiber ~default:Hmap.empty k_local_hmap in
|
|
let h = f h in
|
|
FLS.set fiber k_local_hmap h
|
|
|
|
(** @raise Invalid_argument if not present *)
|
|
let get_in_local_hmap_exn (k : 'a Hmap.key) : 'a =
|
|
let h = get_local_hmap () in
|
|
Hmap.get k h
|
|
|
|
let get_in_local_hmap_opt (k : 'a Hmap.key) : 'a option =
|
|
let h = get_local_hmap () in
|
|
Hmap.find k h
|
|
|
|
let[@inline] set_in_local_hmap (k : 'a Hmap.key) (v : 'a) : unit =
|
|
update_local_hmap (Hmap.add k v)
|
|
|
|
(**/**)
|
|
|
|
(* private functions, to be used by the rest of moonpool *)
|
|
module Private_hmap_ls_ = struct
|
|
(** Copy the hmap from f1.fls to f2.fls *)
|
|
let copy_fls (f1 : Picos.Fiber.t) (f2 : Picos.Fiber.t) : unit =
|
|
match FLS.get_exn f1 k_local_hmap with
|
|
| exception FLS.Not_set -> ()
|
|
| hmap -> FLS.set f2 k_local_hmap hmap
|
|
end
|
|
|
|
(**/**)
|