atomics
nimony/lib/std/atomics.nim
Atomic operations for Nimony. Uses GCC/Clang __atomic_* builtins directly -- no _Atomic types in the generated C code. Atomics are operations, not type properties.
type MemoryOrder = enum moRelaxed = (0, "moRelaxed") moConsume = (1, "moConsume") moAcquire = (2, "moAcquire") moRelease = (3, "moRelease") moAcquireRelease = (4, "moAcquireRelease") moSequentiallyConsistent = (5, "moSequentiallyConsistent")
func dollar`.MemoryOrder(e: MemoryOrder): stringtype Trivial = int64|int8|int16|int32|int64|uint64|uint8|uint16|uint32|uint64|bool|OrdinalEnum|HoleyEnum|ptr|pointer not niltype AtomicFlag = distinct boolproc atomicLoad(location: var T; order: MemoryOrder): Tproc atomicStore(location: var T; desired: T; order: MemoryOrder)proc atomicExchange(location: var T; desired: T; order: MemoryOrder): Tproc atomicCompareExchange(location: var T; expected: var T; desired: T; success: MemoryOrder; failure: MemoryOrder): boolproc atomicCompareExchange(location: var T; expected: var T; desired: T; order: MemoryOrder): boolproc atomicCompareExchangeWeak(location: var T; expected: var T; desired: T; success: MemoryOrder; failure: MemoryOrder): boolproc atomicCompareExchangeWeak(location: var T; expected: var T; desired: T; order: MemoryOrder): boolproc atomicFetchAdd(location: var T; value: T; order: MemoryOrder): Tproc atomicFetchSub(location: var T; value: T; order: MemoryOrder): Tproc atomicFetchAnd(location: var T; value: T; order: MemoryOrder): Tproc atomicFetchOr(location: var T; value: T; order: MemoryOrder): Tproc atomicFetchXor(location: var T; value: T; order: MemoryOrder): Tproc testAndSet(location: var AtomicFlag; order: MemoryOrder): boolproc clear(location: var AtomicFlag; order: MemoryOrder)proc atomicFence(order: MemoryOrder)proc atomicSignalFence(order: MemoryOrder)proc cpuRelax()Hints the CPU that we are in a spin-wait loop. Reduces power consumption and avoids memory-order violations on hyper-threaded cores.
pauseon x86-64,yieldon AArch64, and nothing at all on a target with neither — a hint that does not exist is a hint that can be skipped, so nowhenguards this call and no target has to be enumerated here.proc atomicInc(location: var T; value: T)proc atomicDec(location: var T; value: T)