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

Safe HaskellNone

Data.Atomics.Counter.IORef

Description

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.

Synopsis

Documentation

newtype AtomicCounter Source

Constructors

AtomicCounter (IORef Int) 

newCounter :: Int -> IO AtomicCounterSource

Create a new counter initialized to the given value.

incrCounter :: Int -> AtomicCounter -> IO IntSource

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

readCounterForCAS :: AtomicCounter -> IO CTicketSource

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

peekCTicket :: CTicket -> IntSource

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.