diff options
Diffstat (limited to 'lib/Utilities.ml')
| -rw-r--r-- | lib/Utilities.ml | 17 |
1 files changed, 17 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 |
