mcas_snapshot_volatile.ml Atomic Snapshot
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 ()