From 678664b00d7f6ea1f6c397a9aa7dfa586b7b00db Mon Sep 17 00:00:00 2001 From: Simon Cruanes Date: Sun, 29 Oct 2023 21:13:06 -0400 Subject: [PATCH] feat bb_queue: add `transfer_into` --- src/bb_queue.ml | 15 +++++++++++++++ src/bb_queue.mli | 5 +++++ 2 files changed, 20 insertions(+) diff --git a/src/bb_queue.ml b/src/bb_queue.ml index 3c46878e..e0bb47c1 100644 --- a/src/bb_queue.ml +++ b/src/bb_queue.ml @@ -111,6 +111,21 @@ let transfer (self : 'a t) q2 : unit = ) done +let transfer_into q (self : _ t) : unit = + if not (Queue.is_empty q) then ( + Mutex.lock self.mutex; + + if self.closed then ( + Mutex.unlock self.mutex; + raise Closed + ); + + let was_empty = Queue.is_empty self.q in + Queue.transfer q self.q; + if was_empty then Condition.broadcast self.cond; + Mutex.unlock self.mutex + ) + type 'a gen = unit -> 'a option type 'a iter = ('a -> unit) -> unit diff --git a/src/bb_queue.mli b/src/bb_queue.mli index ba4d0fc5..def162f5 100644 --- a/src/bb_queue.mli +++ b/src/bb_queue.mli @@ -62,6 +62,11 @@ val transfer : 'a t -> 'a Queue.t -> unit @since 0.4 *) +val transfer_into : 'a Queue.t -> 'a t -> unit +(** [transfer q bq] transfers all items from [q] to [bq], atomically. + @raise Closed if [bq] is closed and [q] is not empty. + @since NEXT_RELEASE *) + val close : _ t -> unit (** Close the queue, meaning there won't be any more [push] allowed. *)