scan — atomic snapshot via MCAS validation
let rec scan t =
(* Step 1: collect a speculative snapshot *)
let snapshot = Array.map Mcas_volatile.get t.slots in
(* Step 2: build identity CAS ops — expect same value, write same value *)
let ops =
Array.to_list (
Array.mapi (fun i value ->
Mcas_volatile.make_cas t.slots.(i)
~expected:value ~desired:value)
snapshot)
in
(* Step 3: MCAS succeeds iff all slots still hold snapshot values *)
if Mcas_volatile.mcas ops
then snapshot (* consistent — return it *)
else scan t (* racing update detected — retry *)
let update t i v =
check_index t i;
let rec retry () =
let cur = Mcas_volatile.get t.slots.(i) in
let op = Mcas_volatile.make_cas t.slots.(i)
~expected:cur ~desired:v in
if not (Mcas_volatile.mcas [op]) then retry ()
in retry ()