IORefCAS-0.2: Atomic compare and swap for IORefs and STRefs.

Safe HaskellSafe-Infered




data CASRef a




:: IORef a

The IORef containing a value current

-> a

The old value to compare

-> a

The new value to replace current if old == current

-> IO (Bool, a) 

Performs a machine-level compare and swap operation on an IORef. Returns a tuple containing a Bool which is True when a swap is performed, along with the current value from the IORef.

Note "compare" here means pointer equality in the sense of reallyUnsafePtrEquality#.

ptrEq :: a -> a -> Bool

atomicModifyIORefCAS :: IORef a -> (a -> (a, b)) -> IO b

A drop-in replacement for atomicModifyIORefCAS that optimistically attempts to compute the new value and CAS it into place without introducing new thunks or locking anything. Note that this is more STRICT than its standard counterpart and will only place evaluated (WHNF) values in the IORef.

atomicModifyIORefCAS_ :: IORef t -> (t -> t) -> IO ()

A simpler version that modifies the state but does not return anything.