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