aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/Utilities.ml17
-rw-r--r--lib/Utilities.mli6
2 files changed, 23 insertions, 0 deletions
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