From afbab0968340abcec044d9ac70c4a3ec0756933e Mon Sep 17 00:00:00 2001 From: Estevan Castilho Date: Thu, 13 Aug 2026 02:35:36 +0000 Subject: Atomic swap (and monadic swap) --- lib/Utilities.ml | 17 +++++++++++++++++ lib/Utilities.mli | 6 ++++++ 2 files changed, 23 insertions(+) diff --git a/lib/Utilities.ml b/lib/Utilities.ml index 9ae0119..0a5bd9d 100644 --- a/lib/Utilities.ml +++ b/lib/Utilities.ml @@ -10,3 +10,20 @@ module Result = struct ms (Ok []) end + +module Atomic = struct + let rec swap atom f = + let v = Atomic.get atom in + let v' = f v in + if Atomic.compare_and_set atom v v' + then atom + else swap atom f + + let rec mswap atom f = + let open Result in + let v = Atomic.get atom in + let* v' = f v in + if Atomic.compare_and_set atom v v' + then Ok atom + else mswap atom f +end diff --git a/lib/Utilities.mli b/lib/Utilities.mli index cdb53df..34a03e9 100644 --- a/lib/Utilities.mli +++ b/lib/Utilities.mli @@ -3,3 +3,9 @@ module Result : sig val fmap : ('a -> ('b, 'e) result) -> ('a, 'e) result -> ('b, 'e) result val sequence : ('a, 'b) result list -> ('a list, 'b) result end + +module Atomic : sig + val swap : 'a Atomic.t -> ('a -> 'a) -> 'a Atomic.t + (* This is silly *) + val mswap : 'a Atomic.t -> ('a -> ('a, 'b) result) -> ('a Atomic.t, 'b) result +end -- cgit v1.2.3