From 7b0197e6c2b2d3a6d30632f2663c2612dbda419a Mon Sep 17 00:00:00 2001 From: Simon Cruanes Date: Thu, 15 Jan 2026 20:42:19 -0500 Subject: [PATCH] trace.util: add Unix_util and Mock_ --- src/util/dune | 5 ++++ src/util/mock_.ml | 46 +++++++++++++++++++++++++++++++++++++ src/util/unix_util.dummy.ml | 1 + src/util/unix_util.mli | 1 + src/util/unix_util.real.ml | 1 + 5 files changed, 54 insertions(+) create mode 100644 src/util/mock_.ml create mode 100644 src/util/unix_util.dummy.ml create mode 100644 src/util/unix_util.mli create mode 100644 src/util/unix_util.real.ml diff --git a/src/util/dune b/src/util/dune index 9bc0f53..68c028f 100644 --- a/src/util/dune +++ b/src/util/dune @@ -16,6 +16,11 @@ (mtime mtime.clock.jsoo -> time_util.mtime.ml) (unix -> time_util.unix.ml) (-> time_util.dummy.ml)) + (select + unix_util.ml + from + (unix -> unix_util.real.ml) + (-> unix_util.dummy.ml)) (select domain_util.ml from diff --git a/src/util/mock_.ml b/src/util/mock_.ml new file mode 100644 index 0000000..b98fc70 --- /dev/null +++ b/src/util/mock_.ml @@ -0,0 +1,46 @@ +(** Mocking for tests *) + +module Inner = struct + let mock = ref false + let get_now_ns_ref = ref Time_util.get_time_ns + let get_tid_ref = ref Thread_util.get_tid + let get_pid_ref = ref Unix_util.get_pid + + (** used to mock timing *) + let make_time_mock () : unit -> int64 = + let time_ = ref 0 in + + let get_now_ns () : int64 = + let x = !time_ in + incr time_; + Int64.(mul (of_int x) 1000L) + in + get_now_ns +end + +(** Now, in nanoseconds. Uses {!get_now_ns_ref} *) +let[@inline] now_ns () : int64 = + if !Inner.mock then + !Inner.get_now_ns_ref () + else + Time_util.get_time_ns () + +(** Current thread's ID. Uses {!get_tid_ref} *) +let[@inline] get_tid () : int = + if !Inner.mock then + !Inner.get_tid_ref () + else + Thread_util.get_tid () + +let[@inline] get_pid () : int = + if !Inner.mock then + !Inner.get_pid_ref () + else + Unix_util.get_pid () + +let mock_all () : unit = + Inner.mock := true; + (Inner.get_pid_ref := fun () -> 2); + (Inner.get_tid_ref := fun () -> 3); + Inner.get_now_ns_ref := Inner.make_time_mock (); + () diff --git a/src/util/unix_util.dummy.ml b/src/util/unix_util.dummy.ml new file mode 100644 index 0000000..9c81b96 --- /dev/null +++ b/src/util/unix_util.dummy.ml @@ -0,0 +1 @@ +let get_pid () = -1 diff --git a/src/util/unix_util.mli b/src/util/unix_util.mli new file mode 100644 index 0000000..8920e24 --- /dev/null +++ b/src/util/unix_util.mli @@ -0,0 +1 @@ +val get_pid : unit -> int diff --git a/src/util/unix_util.real.ml b/src/util/unix_util.real.ml new file mode 100644 index 0000000..8d4ec6e --- /dev/null +++ b/src/util/unix_util.real.ml @@ -0,0 +1 @@ +let get_pid = Unix.getpid