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 =
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