avoid recursion in dpool

This commit is contained in:
Simon Cruanes 2024-10-09 00:26:30 -04:00
parent 40e97d969a
commit a40ea8b41b
No known key found for this signature in database
GPG key ID: EBFFF6F283F3A2B4

View file

@ -15,19 +15,23 @@ module Bb_queue = struct
if was_empty then Condition.broadcast self.cond; if was_empty then Condition.broadcast self.cond;
Mutex.unlock self.mutex Mutex.unlock self.mutex
let pop (self : 'a t) : 'a = let pop (type a) (self : a t) : a =
Mutex.lock self.mutex; let module M = struct
let rec loop () = exception Found of a
if Queue.is_empty self.q then ( end in
Condition.wait self.cond self.mutex; try
(loop [@tailcall]) () Mutex.lock self.mutex;
) else ( while true do
let x = Queue.pop self.q in if Queue.is_empty self.q then
Mutex.unlock self.mutex; Condition.wait self.cond self.mutex
x else (
) let x = Queue.pop self.q in
in Mutex.unlock self.mutex;
loop () raise (M.Found x)
)
done;
assert false
with M.Found x -> x
end end
module Lock = struct module Lock = struct