Skip to content

Commit ed5ff97

Browse files
committed
Add test that get is linearizable using Xt
1 parent 0d75a9b commit ed5ff97

File tree

1 file changed

+107
-47
lines changed

1 file changed

+107
-47
lines changed

test/kcas/test.ml

Lines changed: 107 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -274,55 +274,114 @@ let test_no_skew_xt () =
274274

275275
(* *)
276276

277-
let test_read_casn () =
278-
let barrier = Barrier.make 4 in
279-
let test_finished = Atomic.make false in
277+
let test_get_seq () =
278+
[ Mode.obstruction_free; Mode.lock_free ]
279+
|> List.iter @@ fun mode ->
280+
let barrier = Barrier.make 4 in
281+
let test_finished = Atomic.make false in
280282

281-
let a1 = Loc.make 0 in
282-
let a2 = Loc.make 0 in
283+
let a1 = Loc.make ~mode 0 in
284+
let a2 = Loc.make ~mode 0 in
283285

284-
let mutator () =
285-
Barrier.await barrier;
286-
for i = 0 to nb_iter do
287-
let c = [ Op.make_cas a1 i (i + 1); Op.make_cas a2 i (i + 1) ] in
288-
assert (Op.atomically c)
289-
done;
290-
Atomic.set test_finished true
291-
and getter () =
292-
Barrier.await barrier;
293-
while not (Atomic.get test_finished) do
294-
let a = Loc.get a1 in
295-
let b = Loc.get a2 in
296-
assert (a <= b);
297-
if is_single then Domain.cpu_relax ()
298-
done
299-
and getaser () =
300-
Barrier.await barrier;
301-
while not (Atomic.get test_finished) do
302-
let a = Loc.get_as Fun.id a1 in
303-
let b = Loc.get_as Fun.id a2 in
304-
assert (a <= b);
305-
if is_single then Domain.cpu_relax ()
306-
done
307-
and committer () =
308-
Barrier.await barrier;
309-
while not (Atomic.get test_finished) do
310-
let a = Xt.commit { tx = Xt.get a1 } in
311-
let b = Xt.commit { tx = Xt.get a2 } in
312-
assert (a <= b);
313-
if is_single then Domain.cpu_relax ()
314-
done
315-
and updater () =
316-
Barrier.await barrier;
317-
while not (Atomic.get test_finished) do
318-
let a = Loc.update a1 Fun.id in
319-
let b = Loc.update a2 Fun.id in
320-
assert (a <= b);
321-
if is_single then Domain.cpu_relax ()
322-
done
323-
in
286+
let mutator () =
287+
Barrier.await barrier;
288+
for i = 0 to nb_iter do
289+
let c = [ Op.make_cas a1 i (i + 1); Op.make_cas a2 i (i + 1) ] in
290+
assert (Op.atomically c)
291+
done;
292+
Atomic.set test_finished true
293+
and getter () =
294+
Barrier.await barrier;
295+
while not (Atomic.get test_finished) do
296+
let a = Loc.get a1 in
297+
let b = Loc.get a2 in
298+
assert (a <= b);
299+
if is_single then Domain.cpu_relax ()
300+
done
301+
and getaser () =
302+
Barrier.await barrier;
303+
while not (Atomic.get test_finished) do
304+
let a = Loc.get_as Fun.id a1 in
305+
let b = Loc.get_as Fun.id a2 in
306+
assert (a <= b);
307+
if is_single then Domain.cpu_relax ()
308+
done
309+
and committer () =
310+
Barrier.await barrier;
311+
while not (Atomic.get test_finished) do
312+
let a = Xt.commit { tx = Xt.get a1 } in
313+
let b = Xt.commit { tx = Xt.get a2 } in
314+
assert (a <= b);
315+
if is_single then Domain.cpu_relax ()
316+
done
317+
and updater () =
318+
Barrier.await barrier;
319+
while not (Atomic.get test_finished) do
320+
let a = Loc.update a1 Fun.id in
321+
let b = Loc.update a2 Fun.id in
322+
assert (a <= b);
323+
if is_single then Domain.cpu_relax ()
324+
done
325+
in
326+
327+
run_domains [ mutator; getter; getaser; committer; updater ]
328+
329+
(* *)
330+
331+
let test_get_seq_xt () =
332+
[ Mode.obstruction_free; Mode.lock_free ]
333+
|> List.iter @@ fun mode ->
334+
let barrier = Barrier.make 4 in
335+
let test_finished = Atomic.make false in
336+
337+
let a1 = Loc.make ~mode 0 in
338+
let a2 = Loc.make ~mode 0 in
339+
340+
let mutator () =
341+
Barrier.await barrier;
342+
for _ = 0 to nb_iter do
343+
let tx ~xt =
344+
Xt.incr ~xt a1;
345+
Xt.incr ~xt a2
346+
in
347+
Xt.commit { tx }
348+
done;
349+
Atomic.set test_finished true
350+
and getter () =
351+
Barrier.await barrier;
352+
while not (Atomic.get test_finished) do
353+
let a = Loc.get a1 in
354+
let b = Loc.get a2 in
355+
assert (a <= b);
356+
if is_single then Domain.cpu_relax ()
357+
done
358+
and getaser () =
359+
Barrier.await barrier;
360+
while not (Atomic.get test_finished) do
361+
let a = Loc.get_as Fun.id a1 in
362+
let b = Loc.get_as Fun.id a2 in
363+
assert (a <= b);
364+
if is_single then Domain.cpu_relax ()
365+
done
366+
and committer () =
367+
Barrier.await barrier;
368+
while not (Atomic.get test_finished) do
369+
let a = Xt.commit { tx = Xt.get a1 } in
370+
let b = Xt.commit { tx = Xt.get a2 } in
371+
assert (a <= b);
372+
if is_single then Domain.cpu_relax ()
373+
done
374+
and updater () =
375+
Barrier.await barrier;
376+
while not (Atomic.get test_finished) do
377+
let a = Loc.update a1 Fun.id in
378+
let b = Loc.update a2 Fun.id in
379+
assert (a <= b);
380+
if is_single then Domain.cpu_relax ()
381+
done
382+
in
324383

325-
run_domains [ mutator; getter; getaser; committer; updater ]
384+
run_domains [ mutator; getter; getaser; committer; updater ]
326385

327386
(* *)
328387

@@ -774,7 +833,8 @@ let () =
774833
("set", [ Alcotest.test_case "" `Quick test_set ]);
775834
("no skew", [ Alcotest.test_case "" `Quick test_no_skew ]);
776835
("no skew xt", [ Alcotest.test_case "" `Quick test_no_skew_xt ]);
777-
("read casn", [ Alcotest.test_case "" `Quick test_read_casn ]);
836+
("get seq", [ Alcotest.test_case "" `Quick test_get_seq ]);
837+
("get seq xt", [ Alcotest.test_case "" `Quick test_get_seq_xt ]);
778838
( "stress",
779839
[
780840
Alcotest.test_case "" `Quick (fun () ->

0 commit comments

Comments
 (0)