Factor out _locked_pop.

This commit is contained in:
Tony Garnock-Jones 2012-05-03 10:23:04 -04:00
parent 7aba3d5659
commit 6a2d487de3
1 changed files with 10 additions and 9 deletions

View File

@ -53,14 +53,19 @@ let add v q =
let _locked_empty q = let _locked_empty q =
q.capacity = (Array.length q.queue) 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 = let pop q =
Mutex.lock q.mtx; Mutex.lock q.mtx;
while _locked_empty q do while _locked_empty q do
Condition.wait q.nonempty q.mtx Condition.wait q.nonempty q.mtx
done; done;
let result = Array.get q.queue q.read_pointer in let result = _locked_pop q in
q.read_pointer <- (q.read_pointer + 1) mod (Array.length q.queue);
q.capacity <- q.capacity + 1;
Condition.signal q.nonfull; Condition.signal q.nonfull;
Mutex.unlock q.mtx; Mutex.unlock q.mtx;
result result
@ -70,12 +75,8 @@ let peek q =
let result = let result =
if _locked_empty q if _locked_empty q
then None then None
else else (Condition.signal q.nonfull;
(let result = Array.get q.queue q.read_pointer in Some (_locked_pop q))
q.read_pointer <- (q.read_pointer + 1) mod (Array.length q.queue);
q.capacity <- q.capacity + 1;
Condition.signal q.nonfull;
Some result)
in in
Mutex.unlock q.mtx; Mutex.unlock q.mtx;
result result