Skip to content

Commit 91c5771

Browse files
committed
Fix MS queue test loop loop without safe point
1 parent 6b64cae commit 91c5771

File tree

1 file changed

+40
-35
lines changed

1 file changed

+40
-35
lines changed

test/michael_scott_queue/qcheck_michael_scott_queue.ml

Lines changed: 40 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
open Saturn_lockfree.Queue
1+
module Queue = Saturn_lockfree.Queue
22

33
let tests_sequential =
44
QCheck.
@@ -7,57 +7,59 @@ let tests_sequential =
77
Test.make ~name:"push" (list int) (fun lpush ->
88
assume (lpush <> []);
99
(* Building a random queue *)
10-
let queue = create () in
11-
List.iter (push queue) lpush;
10+
let queue = Queue.create () in
11+
List.iter (Queue.push queue) lpush;
1212

1313
(* Testing property *)
14-
not (is_empty queue));
14+
not (Queue.is_empty queue));
1515
(* TEST 2 - push, pop until empty *)
1616
Test.make ~name:"push_pop_opt_until_empty" (list int) (fun lpush ->
1717
(* Building a random queue *)
18-
let queue = create () in
19-
List.iter (push queue) lpush;
18+
let queue = Queue.create () in
19+
List.iter (Queue.push queue) lpush;
2020

2121
(* Popping until [is_empty q] is true *)
2222
let count = ref 0 in
23-
while not (is_empty queue) do
23+
while not (Queue.is_empty queue) do
2424
incr count;
25-
ignore (pop_opt queue)
25+
ignore (Queue.pop_opt queue)
2626
done;
2727

2828
(* Testing property *)
29-
pop_opt queue = None && !count = List.length lpush);
29+
Queue.pop_opt queue = None && !count = List.length lpush);
3030
(* TEST 3 - push, pop_opt, check FIFO *)
3131
Test.make ~name:"fifo" (list int) (fun lpush ->
3232
(* Building a random queue *)
33-
let queue = create () in
34-
List.iter (push queue) lpush;
33+
let queue = Queue.create () in
34+
List.iter (Queue.push queue) lpush;
3535

3636
let out = ref [] in
3737
let insert v = out := v :: !out in
3838

3939
for _ = 1 to List.length lpush do
40-
match pop_opt queue with None -> assert false | Some v -> insert v
40+
match Queue.pop_opt queue with
41+
| None -> assert false
42+
| Some v -> insert v
4143
done;
4244

4345
(* Testing property *)
4446
lpush = List.rev !out);
4547
(* TEST 3 - push, pop_opt, peek_opt check FIFO *)
4648
Test.make ~name:"fifo_peek_opt" (list int) (fun lpush ->
4749
(* Building a random queue *)
48-
let queue = create () in
49-
List.iter (push queue) lpush;
50+
let queue = Queue.create () in
51+
List.iter (Queue.push queue) lpush;
5052

5153
let pop = ref [] in
5254
let peek = ref [] in
5355
let insert out v = out := v :: !out in
5456

5557
for _ = 1 to List.length lpush do
56-
match peek_opt queue with
58+
match Queue.peek_opt queue with
5759
| None -> assert false
5860
| Some v -> (
5961
insert peek v;
60-
match pop_opt queue with
62+
match Queue.pop_opt queue with
6163
| None -> assert false
6264
| Some v -> insert pop v)
6365
done;
@@ -73,28 +75,31 @@ let tests_one_consumer_one_producer =
7375
Parallel [push] and [pop_opt]. *)
7476
Test.make ~name:"parallel_fifo" (list int) (fun lpush ->
7577
(* Initialization *)
76-
let queue = create () in
78+
let queue = Queue.create () in
7779
let barrier = Barrier.create 2 in
7880

7981
(* Producer pushes. *)
8082
let producer =
8183
Domain.spawn (fun () ->
8284
Barrier.await barrier;
83-
List.iter (push queue) lpush)
85+
List.iter (Queue.push queue) lpush)
8486
in
8587

8688
Barrier.await barrier;
8789
let fifo =
8890
List.fold_left
8991
(fun acc item ->
90-
let popped = ref None in
91-
while Option.is_none !popped do
92-
popped := pop_opt queue
93-
done;
94-
acc && item = Option.get !popped)
92+
let rec pop_one () =
93+
match Queue.pop_opt queue with
94+
| None ->
95+
Domain.cpu_relax ();
96+
pop_one ()
97+
| Some item' -> acc && item = item'
98+
in
99+
pop_one ())
95100
true lpush
96101
in
97-
let empty = is_empty queue in
102+
let empty = Queue.is_empty queue in
98103

99104
(* Ensure nothing is left behind. *)
100105
Domain.join producer;
@@ -104,22 +109,22 @@ let tests_one_consumer_one_producer =
104109
Test.make ~name:"parallel_peek" (list int) (fun pushed ->
105110
(* Initialization *)
106111
let npush = List.length pushed in
107-
let queue = create () in
112+
let queue = Queue.create () in
108113
let barrier = Barrier.create 2 in
109114

110115
(* Producer pushes. *)
111116
let producer =
112117
Domain.spawn (fun () ->
113118
Barrier.await barrier;
114-
List.iter (push queue) pushed)
119+
List.iter (Queue.push queue) pushed)
115120
in
116121

117122
let peeked = ref [] in
118123
let popped = ref [] in
119124
Barrier.await barrier;
120125
for _ = 1 to npush do
121-
peeked := peek_opt queue :: !peeked;
122-
popped := pop_opt queue :: !popped
126+
peeked := Queue.peek_opt queue :: !peeked;
127+
popped := Queue.pop_opt queue :: !popped
123128
done;
124129

125130
Domain.join producer;
@@ -147,7 +152,7 @@ let tests_two_domains =
147152
Test.make ~name:"parallel_pop_opt_push" (pair small_nat small_nat)
148153
(fun (npush1, npush2) ->
149154
(* Initialization *)
150-
let queue = create () in
155+
let queue = Queue.create () in
151156
let barrier = Barrier.create 2 in
152157

153158
(* Using these lists instead of a random one enables to
@@ -158,9 +163,9 @@ let tests_two_domains =
158163
let work lpush =
159164
List.map
160165
(fun elt ->
161-
push queue elt;
166+
Queue.push queue elt;
162167
Domain.cpu_relax ();
163-
pop_opt queue)
168+
Queue.pop_opt queue)
164169
lpush
165170
in
166171

@@ -205,7 +210,7 @@ let tests_two_domains =
205210
Test.make ~name:"parallel_pop_opt_push_random" (pair small_nat small_nat)
206211
(fun (npush1, npush2) ->
207212
(* Initialization *)
208-
let queue = create () in
213+
let queue = Queue.create () in
209214
let barrier = Barrier.create 2 in
210215

211216
let lpush1 = List.init npush1 (fun i -> i) in
@@ -222,11 +227,11 @@ let tests_two_domains =
222227
match lpush with
223228
| [] -> popped
224229
| elt :: xs ->
225-
push queue elt;
230+
Queue.push queue elt;
226231
loop xs popped)
227232
else (
228233
incr consecutive_pop;
229-
let p = pop_opt queue in
234+
let p = Queue.pop_opt queue in
230235
loop lpush (p :: popped))
231236
in
232237
loop lpush []
@@ -256,7 +261,7 @@ let tests_two_domains =
256261
(* Pop everything that is still on the queue *)
257262
let popped3 =
258263
let rec loop popped =
259-
match pop_opt queue with
264+
match Queue.pop_opt queue with
260265
| None -> popped
261266
| Some v -> loop (v :: popped)
262267
in

0 commit comments

Comments
 (0)