Factor out _locked_pop.
This commit is contained in:
parent
7aba3d5659
commit
6a2d487de3
19
squeue.ml
19
squeue.ml
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue