atomic-primops- A safe approach to CAS and other atomic ops in Haskell.

Safe HaskellNone



This version uses a boxed IORef representation, but it can be somewhat cheaper than the Refence version because it uses raw CAS rather than full atomicModifyIORef.



newCounter :: Int -> IO AtomicCounter Source

Create a new counter initialized to the given value.

readCounterForCAS :: AtomicCounter -> IO CTicket Source

Just like the Data.Atomics CAS interface, this routine returns an opaque ticket that can be used in CAS operations.

peekCTicket :: CTicket -> Int Source

Opaque tickets cannot be constructed, but they can be destructed into values.

writeCounter :: AtomicCounter -> Int -> IO () Source

Make a non-atomic write to the counter. No memory-barrier.

casCounter :: AtomicCounter -> CTicket -> Int -> IO (Bool, CTicket) Source

Compare and swap for the counter ADT. Similar behavior to casIORef.

incrCounter :: Int -> AtomicCounter -> IO Int Source

Try repeatedly until we successfully increment the counter by a given amount. Returns the original value of the counter (pre-increment).