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 +++++++++++++++++ 1 file changed, 17 insertions(+) (limited to 'lib/Utilities.ml') 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 -- cgit v1.2.3