From c55e3a2dfc41346ee8312ae9bbaa09eb42e80729 Mon Sep 17 00:00:00 2001 From: Simon Cruanes Date: Tue, 15 Apr 2025 09:44:46 -0400 Subject: [PATCH] feat pool: expose acquire/release --- src/core/pool.ml | 17 +++++++++++------ src/core/pool.mli | 9 +++++++++ 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/core/pool.ml b/src/core/pool.ml index fc9a0461..534142e3 100644 --- a/src/core/pool.ml +++ b/src/core/pool.ml @@ -12,20 +12,20 @@ type 'a t = { let create ?(clear = ignore) ~mk_item ?(max_size = 512) () : _ t = { mk_item; clear; max_size; items = A.make Nil } -let rec acquire_ self = +let rec acquire self = match A.get self.items with | Nil -> self.mk_item () | Cons (_, x, tl) as l -> if A.compare_and_set self.items l tl then x else - acquire_ self + acquire self let[@inline] size_ = function | Cons (sz, _, _) -> sz | Nil -> 0 -let release_ self x : unit = +let release self x : unit = let rec loop () = match A.get self.items with | Cons (sz, _, _) when sz >= self.max_size -> @@ -40,12 +40,17 @@ let release_ self x : unit = loop () let with_resource (self : _ t) f = - let x = acquire_ self in + let x = acquire self in try let res = f x in - release_ self x; + release self x; res with e -> let bt = Printexc.get_raw_backtrace () in - release_ self x; + release self x; Printexc.raise_with_backtrace e bt + +module Raw = struct + let release = release + let acquire = acquire +end diff --git a/src/core/pool.mli b/src/core/pool.mli index a2418e11..99c68fca 100644 --- a/src/core/pool.mli +++ b/src/core/pool.mli @@ -23,3 +23,12 @@ val with_resource : 'a t -> ('a -> 'b) -> 'b (** [with_resource pool f] runs [f x] with [x] a resource; when [f] fails or returns, [x] is returned to the pool for future reuse. *) + +(** Low level control over the pool. + This is easier to get wrong (e.g. releasing the same resource twice) + so use with caution. + @since NEXT_RELEASE *) +module Raw : sig + val acquire : 'a t -> 'a + val release : 'a t -> 'a -> unit +end