From 6a2d487de372047a513d95eecff5360ebd2284c5 Mon Sep 17 00:00:00 2001 From: Tony Garnock-Jones Date: Thu, 3 May 2012 10:23:04 -0400 Subject: [PATCH] Factor out _locked_pop. --- squeue.ml | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/squeue.ml b/squeue.ml index f25202e..5df3ea1 100644 --- a/squeue.ml +++ b/squeue.ml @@ -53,14 +53,19 @@ let add v q = let _locked_empty q = q.capacity = (Array.length q.queue) +let _locked_pop q = + let result = Array.get q.queue q.read_pointer in + Array.set q.queue q.read_pointer (Obj.magic None); + q.read_pointer <- (q.read_pointer + 1) mod (Array.length q.queue); + q.capacity <- q.capacity + 1; + result + let pop q = Mutex.lock q.mtx; while _locked_empty q do Condition.wait q.nonempty q.mtx done; - let result = Array.get q.queue q.read_pointer in - q.read_pointer <- (q.read_pointer + 1) mod (Array.length q.queue); - q.capacity <- q.capacity + 1; + let result = _locked_pop q in Condition.signal q.nonfull; Mutex.unlock q.mtx; result @@ -70,12 +75,8 @@ let peek q = let result = if _locked_empty q then None - else - (let result = Array.get q.queue q.read_pointer in - q.read_pointer <- (q.read_pointer + 1) mod (Array.length q.queue); - q.capacity <- q.capacity + 1; - Condition.signal q.nonfull; - Some result) + else (Condition.signal q.nonfull; + Some (_locked_pop q)) in Mutex.unlock q.mtx; result