atomic-primops-foreign-0.6.2: An atomic counter implemented using the FFI.

Safe HaskellNone



This implementation stores an unboxed counter and uses FFI operations to modify its contents. It has the advantage that it can use true fetch-and-add operations. It has the disadvantage of extra overhead due to FFI calls.

For more documentation, see the module Data.Atomics.Counter, which exports the same interface as this module.



type AtomicCounter = ForeignPtr Int Source

The type of mutable atomic counters.

type CTicket = Int Source

You should not depend on this type. It varies between different implementations of atomic counters.

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.

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

Increment the counter by a given amount. Returns the original value before the increment.

Note that UNLIKE with boxed implementations of counters, where increment is based on CAS, this increment is O(1). Fetch-and-add does not require a retry loop like CAS.

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

An alternate version for when you don't care about the old value.