From 6f393734e54146c4d26325aea006368380d97280 Mon Sep 17 00:00:00 2001 From: Enrico Tassi Date: Mon, 5 Sep 2016 16:23:09 +0200 Subject: Summary: simpler API for process-local storage --- library/summary.ml | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) (limited to 'library/summary.ml') diff --git a/library/summary.ml b/library/summary.ml index 4fef06438..6efa07f38 100644 --- a/library/summary.ml +++ b/library/summary.ml @@ -186,4 +186,29 @@ let ref ?(freeze=fun _ r -> r) ~name x = init_function = (fun () -> r := x) }; r +module Local = struct + +type 'a local_ref = ('a CEphemeron.key * string) ref + +let (:=) r v = r := (CEphemeron.create v, snd !r) + +let (!) r = + let key, name = !r in + try CEphemeron.get key + with CEphemeron.InvalidKey -> + let _, { init_function } = + Int.Map.find (String.hash (mangle name)) !summaries in + init_function (); + CEphemeron.get (fst !r) + +let ref ?(freeze=fun x -> x) ~name init = + let r = Pervasives.ref (CEphemeron.create init, name) in + declare_summary name + { freeze_function = (fun _ -> freeze !r); + unfreeze_function = ((:=) r); + init_function = (fun () -> r := init) }; + r + +end + let dump = Dyn.dump -- cgit v1.2.3