Documentation
¶
Overview ¶
Package arch provides architecture-specific atomic primitives with explicit memory ordering.
This is an internal package that implements the low-level atomic operations for different CPU architectures. Higher-level types in the parent atomix package build on these primitives.
Architecture Support ¶
The package provides optimized implementations for:
- amd64: x86-64 with TSO (Total Store Ordering)
- arm64: ARM64 with LSE (Large System Extensions)
- riscv64: RISC-V 64-bit with LL/SC atomics
- loong64: LoongArch 64-bit with LL/SC atomics
All other architectures fall back to sync/atomic which provides sequential consistency (equivalent to AcqRel ordering).
Memory Ordering ¶
All functions include a memory ordering suffix:
- Relaxed: No ordering guarantees, fastest
- Acquire: Loads after this see stores before a paired Release
- Release: Stores before this are visible after a paired Acquire
- AcqRel: Both Acquire and Release semantics (for RMW operations)
Implementation Strategy ¶
The implementation uses different strategies per architecture:
x86-64 (TSO):
x86-64's Total Store Ordering provides strong guarantees that make all load/store orderings equivalent. Plain memory access is atomic for aligned values, so Load and Store operations are implemented as pure Go functions for inlining. Only read-modify-write operations (Swap, CAS, Add) require assembly with LOCK prefix or XCHG.
ARM64:
ARM64 has weak ordering requiring explicit acquire/release instructions. - Relaxed Load/Store: Plain memory access (inlinable pure Go) - Acquire Load: LDAR instruction (assembly) - Release Store: STLR instruction (assembly) - RMW operations: LSE instructions with ordering (assembly)
RISC-V64 / LoongArch64:
These architectures have weak ordering and all atomic operations require explicit fence instructions. All operations are implemented in assembly: - RISC-V: Uses AMO instructions with .aq/.rl suffixes, or LR/SC loops - LoongArch: Uses AM* instructions, or LL/SC loops with DBAR barriers
128-bit Atomics ¶
128-bit operations are available on all supported architectures:
- amd64: CMPXCHG16B instruction (requires 16-byte alignment)
- arm64: LDXP/STXP (default) or CASP with -tags=lse2 for ARMv8.4+
- riscv64/loong64: Emulated via LL/SC on low 64 bits with full barrier
Inlining Optimization ¶
To enable inlining for hot-path operations, load/store functions are split into separate files:
- loadstore_amd64.go: Pure Go implementations for x86-64 TSO
- loadstore_arm64.go: Pure Go relaxed implementations for ARM64
Assembly stubs are only used where hardware instructions with ordering are required, marked with //go:noescape to prevent escape analysis overhead.
Function Naming Convention ¶
<Op><Type><Ordering>
Where:
- Op: Load, Store, Swap, Cas, Cax, Add, And, Or, Xor
- Type: Int32, Uint32, Int64, Uint64, Uintptr, Pointer, Uint128
- Ordering: Relaxed, Acquire, Release, AcqRel
Cas returns bool (success), Cax returns old value (compare-exchange). Add returns the new value. Swap/And/Or/Xor return the previous value.
Index ¶
- func AddInt32AcqRel(addr *int32, delta int32) int32
- func AddInt32Acquire(addr *int32, delta int32) int32
- func AddInt32Relaxed(addr *int32, delta int32) int32
- func AddInt32Release(addr *int32, delta int32) int32
- func AddInt64AcqRel(addr *int64, delta int64) int64
- func AddInt64Acquire(addr *int64, delta int64) int64
- func AddInt64Relaxed(addr *int64, delta int64) int64
- func AddInt64Release(addr *int64, delta int64) int64
- func AddUint32AcqRel(addr *uint32, delta uint32) uint32
- func AddUint32Acquire(addr *uint32, delta uint32) uint32
- func AddUint32Relaxed(addr *uint32, delta uint32) uint32
- func AddUint32Release(addr *uint32, delta uint32) uint32
- func AddUint64AcqRel(addr *uint64, delta uint64) uint64
- func AddUint64Acquire(addr *uint64, delta uint64) uint64
- func AddUint64Relaxed(addr *uint64, delta uint64) uint64
- func AddUint64Release(addr *uint64, delta uint64) uint64
- func AddUintptrAcqRel(addr *uintptr, delta uintptr) uintptr
- func AddUintptrAcquire(addr *uintptr, delta uintptr) uintptr
- func AddUintptrRelaxed(addr *uintptr, delta uintptr) uintptr
- func AddUintptrRelease(addr *uintptr, delta uintptr) uintptr
- func AndInt32AcqRel(addr *int32, mask int32) int32
- func AndInt32Acquire(addr *int32, mask int32) int32
- func AndInt32Relaxed(addr *int32, mask int32) int32
- func AndInt32Release(addr *int32, mask int32) int32
- func AndInt64AcqRel(addr *int64, mask int64) int64
- func AndInt64Acquire(addr *int64, mask int64) int64
- func AndInt64Relaxed(addr *int64, mask int64) int64
- func AndInt64Release(addr *int64, mask int64) int64
- func AndUint32AcqRel(addr *uint32, mask uint32) uint32
- func AndUint32Acquire(addr *uint32, mask uint32) uint32
- func AndUint32Relaxed(addr *uint32, mask uint32) uint32
- func AndUint32Release(addr *uint32, mask uint32) uint32
- func AndUint64AcqRel(addr *uint64, mask uint64) uint64
- func AndUint64Acquire(addr *uint64, mask uint64) uint64
- func AndUint64Relaxed(addr *uint64, mask uint64) uint64
- func AndUint64Release(addr *uint64, mask uint64) uint64
- func AndUintptrAcqRel(addr *uintptr, mask uintptr) uintptr
- func AndUintptrAcquire(addr *uintptr, mask uintptr) uintptr
- func AndUintptrRelaxed(addr *uintptr, mask uintptr) uintptr
- func AndUintptrRelease(addr *uintptr, mask uintptr) uintptr
- func BarrierAcqRel()
- func BarrierAcquire()
- func BarrierRelease()
- func CasInt32AcqRel(addr *int32, old, new int32) bool
- func CasInt32Acquire(addr *int32, old, new int32) bool
- func CasInt32Relaxed(addr *int32, old, new int32) bool
- func CasInt32Release(addr *int32, old, new int32) bool
- func CasInt64AcqRel(addr *int64, old, new int64) bool
- func CasInt64Acquire(addr *int64, old, new int64) bool
- func CasInt64Relaxed(addr *int64, old, new int64) bool
- func CasInt64Release(addr *int64, old, new int64) bool
- func CasPointerAcqRel(addr *unsafe.Pointer, old, new unsafe.Pointer) bool
- func CasPointerAcquire(addr *unsafe.Pointer, old, new unsafe.Pointer) bool
- func CasPointerRelaxed(addr *unsafe.Pointer, old, new unsafe.Pointer) bool
- func CasPointerRelease(addr *unsafe.Pointer, old, new unsafe.Pointer) bool
- func CasUint128AcqRel(addr *[16]byte, oldLo, oldHi, newLo, newHi uint64) bool
- func CasUint128Acquire(addr *[16]byte, oldLo, oldHi, newLo, newHi uint64) bool
- func CasUint128Relaxed(addr *[16]byte, oldLo, oldHi, newLo, newHi uint64) bool
- func CasUint128Release(addr *[16]byte, oldLo, oldHi, newLo, newHi uint64) bool
- func CasUint32AcqRel(addr *uint32, old, new uint32) bool
- func CasUint32Acquire(addr *uint32, old, new uint32) bool
- func CasUint32Relaxed(addr *uint32, old, new uint32) bool
- func CasUint32Release(addr *uint32, old, new uint32) bool
- func CasUint64AcqRel(addr *uint64, old, new uint64) bool
- func CasUint64Acquire(addr *uint64, old, new uint64) bool
- func CasUint64Relaxed(addr *uint64, old, new uint64) bool
- func CasUint64Release(addr *uint64, old, new uint64) bool
- func CasUintptrAcqRel(addr *uintptr, old, new uintptr) bool
- func CasUintptrAcquire(addr *uintptr, old, new uintptr) bool
- func CasUintptrRelaxed(addr *uintptr, old, new uintptr) bool
- func CasUintptrRelease(addr *uintptr, old, new uintptr) bool
- func CaxInt32AcqRel(addr *int32, old, new int32) int32
- func CaxInt32Acquire(addr *int32, old, new int32) int32
- func CaxInt32Relaxed(addr *int32, old, new int32) int32
- func CaxInt32Release(addr *int32, old, new int32) int32
- func CaxInt64AcqRel(addr *int64, old, new int64) int64
- func CaxInt64Acquire(addr *int64, old, new int64) int64
- func CaxInt64Relaxed(addr *int64, old, new int64) int64
- func CaxInt64Release(addr *int64, old, new int64) int64
- func CaxPointerAcqRel(addr *unsafe.Pointer, old, new unsafe.Pointer) unsafe.Pointer
- func CaxPointerAcquire(addr *unsafe.Pointer, old, new unsafe.Pointer) unsafe.Pointer
- func CaxPointerRelaxed(addr *unsafe.Pointer, old, new unsafe.Pointer) unsafe.Pointer
- func CaxPointerRelease(addr *unsafe.Pointer, old, new unsafe.Pointer) unsafe.Pointer
- func CaxUint128AcqRel(addr *[16]byte, oldLo, oldHi, newLo, newHi uint64) (lo, hi uint64)
- func CaxUint128Acquire(addr *[16]byte, oldLo, oldHi, newLo, newHi uint64) (lo, hi uint64)
- func CaxUint128Relaxed(addr *[16]byte, oldLo, oldHi, newLo, newHi uint64) (lo, hi uint64)
- func CaxUint128Release(addr *[16]byte, oldLo, oldHi, newLo, newHi uint64) (lo, hi uint64)
- func CaxUint32AcqRel(addr *uint32, old, new uint32) uint32
- func CaxUint32Acquire(addr *uint32, old, new uint32) uint32
- func CaxUint32Relaxed(addr *uint32, old, new uint32) uint32
- func CaxUint32Release(addr *uint32, old, new uint32) uint32
- func CaxUint64AcqRel(addr *uint64, old, new uint64) uint64
- func CaxUint64Acquire(addr *uint64, old, new uint64) uint64
- func CaxUint64Relaxed(addr *uint64, old, new uint64) uint64
- func CaxUint64Release(addr *uint64, old, new uint64) uint64
- func CaxUintptrAcqRel(addr *uintptr, old, new uintptr) uintptr
- func CaxUintptrAcquire(addr *uintptr, old, new uintptr) uintptr
- func CaxUintptrRelaxed(addr *uintptr, old, new uintptr) uintptr
- func CaxUintptrRelease(addr *uintptr, old, new uintptr) uintptr
- func LoadInt32Acquire(addr *int32) int32
- func LoadInt32Relaxed(addr *int32) int32
- func LoadInt64Acquire(addr *int64) int64
- func LoadInt64Relaxed(addr *int64) int64
- func LoadPointerAcquire(addr *unsafe.Pointer) unsafe.Pointer
- func LoadPointerRelaxed(addr *unsafe.Pointer) unsafe.Pointer
- func LoadUint128Acquire(addr *[16]byte) (lo, hi uint64)
- func LoadUint128Relaxed(addr *[16]byte) (lo, hi uint64)
- func LoadUint32Acquire(addr *uint32) uint32
- func LoadUint32Relaxed(addr *uint32) uint32
- func LoadUint64Acquire(addr *uint64) uint64
- func LoadUint64Relaxed(addr *uint64) uint64
- func LoadUintptrAcquire(addr *uintptr) uintptr
- func LoadUintptrRelaxed(addr *uintptr) uintptr
- func OrInt32AcqRel(addr *int32, mask int32) int32
- func OrInt32Acquire(addr *int32, mask int32) int32
- func OrInt32Relaxed(addr *int32, mask int32) int32
- func OrInt32Release(addr *int32, mask int32) int32
- func OrInt64AcqRel(addr *int64, mask int64) int64
- func OrInt64Acquire(addr *int64, mask int64) int64
- func OrInt64Relaxed(addr *int64, mask int64) int64
- func OrInt64Release(addr *int64, mask int64) int64
- func OrUint32AcqRel(addr *uint32, mask uint32) uint32
- func OrUint32Acquire(addr *uint32, mask uint32) uint32
- func OrUint32Relaxed(addr *uint32, mask uint32) uint32
- func OrUint32Release(addr *uint32, mask uint32) uint32
- func OrUint64AcqRel(addr *uint64, mask uint64) uint64
- func OrUint64Acquire(addr *uint64, mask uint64) uint64
- func OrUint64Relaxed(addr *uint64, mask uint64) uint64
- func OrUint64Release(addr *uint64, mask uint64) uint64
- func OrUintptrAcqRel(addr *uintptr, mask uintptr) uintptr
- func OrUintptrAcquire(addr *uintptr, mask uintptr) uintptr
- func OrUintptrRelaxed(addr *uintptr, mask uintptr) uintptr
- func OrUintptrRelease(addr *uintptr, mask uintptr) uintptr
- func StoreInt32Relaxed(addr *int32, val int32)
- func StoreInt32Release(addr *int32, val int32)
- func StoreInt64Relaxed(addr *int64, val int64)
- func StoreInt64Release(addr *int64, val int64)
- func StorePointerRelaxed(addr *unsafe.Pointer, val unsafe.Pointer)
- func StorePointerRelease(addr *unsafe.Pointer, val unsafe.Pointer)
- func StoreUint128Relaxed(addr *[16]byte, lo, hi uint64)
- func StoreUint128Release(addr *[16]byte, lo, hi uint64)
- func StoreUint32Relaxed(addr *uint32, val uint32)
- func StoreUint32Release(addr *uint32, val uint32)
- func StoreUint64Relaxed(addr *uint64, val uint64)
- func StoreUint64Release(addr *uint64, val uint64)
- func StoreUintptrRelaxed(addr *uintptr, val uintptr)
- func StoreUintptrRelease(addr *uintptr, val uintptr)
- func SwapInt32AcqRel(addr *int32, new int32) int32
- func SwapInt32Acquire(addr *int32, new int32) int32
- func SwapInt32Relaxed(addr *int32, new int32) int32
- func SwapInt32Release(addr *int32, new int32) int32
- func SwapInt64AcqRel(addr *int64, new int64) int64
- func SwapInt64Acquire(addr *int64, new int64) int64
- func SwapInt64Relaxed(addr *int64, new int64) int64
- func SwapInt64Release(addr *int64, new int64) int64
- func SwapPointerAcqRel(addr *unsafe.Pointer, new unsafe.Pointer) unsafe.Pointer
- func SwapPointerAcquire(addr *unsafe.Pointer, new unsafe.Pointer) unsafe.Pointer
- func SwapPointerRelaxed(addr *unsafe.Pointer, new unsafe.Pointer) unsafe.Pointer
- func SwapPointerRelease(addr *unsafe.Pointer, new unsafe.Pointer) unsafe.Pointer
- func SwapUint128AcqRel(addr *[16]byte, newLo, newHi uint64) (oldLo, oldHi uint64)
- func SwapUint128Acquire(addr *[16]byte, newLo, newHi uint64) (oldLo, oldHi uint64)
- func SwapUint128Relaxed(addr *[16]byte, newLo, newHi uint64) (oldLo, oldHi uint64)
- func SwapUint128Release(addr *[16]byte, newLo, newHi uint64) (oldLo, oldHi uint64)
- func SwapUint32AcqRel(addr *uint32, new uint32) uint32
- func SwapUint32Acquire(addr *uint32, new uint32) uint32
- func SwapUint32Relaxed(addr *uint32, new uint32) uint32
- func SwapUint32Release(addr *uint32, new uint32) uint32
- func SwapUint64AcqRel(addr *uint64, new uint64) uint64
- func SwapUint64Acquire(addr *uint64, new uint64) uint64
- func SwapUint64Relaxed(addr *uint64, new uint64) uint64
- func SwapUint64Release(addr *uint64, new uint64) uint64
- func SwapUintptrAcqRel(addr *uintptr, new uintptr) uintptr
- func SwapUintptrAcquire(addr *uintptr, new uintptr) uintptr
- func SwapUintptrRelaxed(addr *uintptr, new uintptr) uintptr
- func SwapUintptrRelease(addr *uintptr, new uintptr) uintptr
- func XorInt32AcqRel(addr *int32, mask int32) int32
- func XorInt32Acquire(addr *int32, mask int32) int32
- func XorInt32Relaxed(addr *int32, mask int32) int32
- func XorInt32Release(addr *int32, mask int32) int32
- func XorInt64AcqRel(addr *int64, mask int64) int64
- func XorInt64Acquire(addr *int64, mask int64) int64
- func XorInt64Relaxed(addr *int64, mask int64) int64
- func XorInt64Release(addr *int64, mask int64) int64
- func XorUint32AcqRel(addr *uint32, mask uint32) uint32
- func XorUint32Acquire(addr *uint32, mask uint32) uint32
- func XorUint32Relaxed(addr *uint32, mask uint32) uint32
- func XorUint32Release(addr *uint32, mask uint32) uint32
- func XorUint64AcqRel(addr *uint64, mask uint64) uint64
- func XorUint64Acquire(addr *uint64, mask uint64) uint64
- func XorUint64Relaxed(addr *uint64, mask uint64) uint64
- func XorUint64Release(addr *uint64, mask uint64) uint64
- func XorUintptrAcqRel(addr *uintptr, mask uintptr) uintptr
- func XorUintptrAcquire(addr *uintptr, mask uintptr) uintptr
- func XorUintptrRelaxed(addr *uintptr, mask uintptr) uintptr
- func XorUintptrRelease(addr *uintptr, mask uintptr) uintptr
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func AddInt32AcqRel ¶
func AddInt32Acquire ¶
func AddInt32Relaxed ¶
Add atomically adds delta and returns the new value.
func AddInt32Release ¶
func AddInt64AcqRel ¶
func AddInt64Acquire ¶
func AddInt64Relaxed ¶
func AddInt64Release ¶
func AddUint32AcqRel ¶
func AddUint32Acquire ¶
func AddUint32Relaxed ¶
func AddUint32Release ¶
func AddUint64AcqRel ¶
func AddUint64Acquire ¶
func AddUint64Relaxed ¶
func AddUint64Release ¶
func AddUintptrAcqRel ¶
func AddUintptrAcquire ¶
func AddUintptrRelaxed ¶
func AddUintptrRelease ¶
func AndInt32AcqRel ¶
func AndInt32Acquire ¶
func AndInt32Relaxed ¶
And atomically performs *addr &= mask and returns the old value.
func AndInt32Release ¶
func AndInt64AcqRel ¶
func AndInt64Acquire ¶
func AndInt64Relaxed ¶
func AndInt64Release ¶
func AndUint32AcqRel ¶
func AndUint32Acquire ¶
func AndUint32Relaxed ¶
func AndUint32Release ¶
func AndUint64AcqRel ¶
func AndUint64Acquire ¶
func AndUint64Relaxed ¶
func AndUint64Release ¶
func AndUintptrAcqRel ¶
func AndUintptrAcquire ¶
func AndUintptrRelaxed ¶
func AndUintptrRelease ¶
func BarrierAcqRel ¶
func BarrierAcqRel()
func BarrierAcquire ¶
func BarrierAcquire()
func BarrierRelease ¶
func BarrierRelease()
func CasInt32AcqRel ¶
func CasInt32Acquire ¶
func CasInt32Relaxed ¶
Cas atomically compares *addr with old and swaps if equal. Returns true if the swap occurred.
func CasInt32Release ¶
func CasInt64AcqRel ¶
func CasInt64Acquire ¶
func CasInt64Relaxed ¶
func CasInt64Release ¶
func CasUint128AcqRel ¶
func CasUint128Acquire ¶
func CasUint128Relaxed ¶
func CasUint128Release ¶
func CasUint32AcqRel ¶
func CasUint32Acquire ¶
func CasUint32Relaxed ¶
func CasUint32Release ¶
func CasUint64AcqRel ¶
func CasUint64Acquire ¶
func CasUint64Relaxed ¶
func CasUint64Release ¶
func CasUintptrAcqRel ¶
func CasUintptrAcquire ¶
func CasUintptrRelaxed ¶
func CasUintptrRelease ¶
func CaxInt32AcqRel ¶
func CaxInt32Acquire ¶
func CaxInt32Relaxed ¶
Cax atomically compares *addr with old and swaps if equal. Returns the previous value (compare-exchange).
func CaxInt32Release ¶
func CaxInt64AcqRel ¶
func CaxInt64Acquire ¶
func CaxInt64Relaxed ¶
func CaxInt64Release ¶
func CaxPointerAcqRel ¶
func CaxPointerAcquire ¶
func CaxPointerRelaxed ¶
func CaxPointerRelease ¶
func CaxUint128AcqRel ¶
func CaxUint128Acquire ¶
func CaxUint128Relaxed ¶
func CaxUint128Release ¶
func CaxUint32AcqRel ¶
func CaxUint32Acquire ¶
func CaxUint32Relaxed ¶
func CaxUint32Release ¶
func CaxUint64AcqRel ¶
func CaxUint64Acquire ¶
func CaxUint64Relaxed ¶
func CaxUint64Release ¶
func CaxUintptrAcqRel ¶
func CaxUintptrAcquire ¶
func CaxUintptrRelaxed ¶
func CaxUintptrRelease ¶
func LoadInt32Acquire ¶
LoadInt32Acquire atomically loads *addr with acquire memory ordering. On x86-64 TSO, this is equivalent to relaxed ordering.
func LoadInt32Relaxed ¶
LoadInt32Relaxed atomically loads *addr with relaxed memory ordering.
func LoadInt64Acquire ¶
LoadInt64Acquire atomically loads *addr with acquire memory ordering.
func LoadInt64Relaxed ¶
LoadInt64Relaxed atomically loads *addr with relaxed memory ordering.
func LoadPointerAcquire ¶
LoadPointerAcquire atomically loads *addr with acquire memory ordering.
func LoadPointerRelaxed ¶
LoadPointerRelaxed atomically loads *addr with relaxed memory ordering.
func LoadUint128Acquire ¶
func LoadUint128Relaxed ¶
func LoadUint32Acquire ¶
LoadUint32Acquire atomically loads *addr with acquire memory ordering.
func LoadUint32Relaxed ¶
LoadUint32Relaxed atomically loads *addr with relaxed memory ordering.
func LoadUint64Acquire ¶
LoadUint64Acquire atomically loads *addr with acquire memory ordering.
func LoadUint64Relaxed ¶
LoadUint64Relaxed atomically loads *addr with relaxed memory ordering.
func LoadUintptrAcquire ¶
LoadUintptrAcquire atomically loads *addr with acquire memory ordering.
func LoadUintptrRelaxed ¶
LoadUintptrRelaxed atomically loads *addr with relaxed memory ordering.
func OrInt32AcqRel ¶
func OrInt32Acquire ¶
func OrInt32Relaxed ¶
Or atomically performs *addr |= mask and returns the old value.
func OrInt32Release ¶
func OrInt64AcqRel ¶
func OrInt64Acquire ¶
func OrInt64Relaxed ¶
func OrInt64Release ¶
func OrUint32AcqRel ¶
func OrUint32Acquire ¶
func OrUint32Relaxed ¶
func OrUint32Release ¶
func OrUint64AcqRel ¶
func OrUint64Acquire ¶
func OrUint64Relaxed ¶
func OrUint64Release ¶
func OrUintptrAcqRel ¶
func OrUintptrAcquire ¶
func OrUintptrRelaxed ¶
func OrUintptrRelease ¶
func StoreInt32Relaxed ¶
StoreInt32Relaxed atomically stores val to *addr with relaxed memory ordering.
func StoreInt32Release ¶
StoreInt32Release atomically stores val to *addr with release memory ordering. On x86-64 TSO, this is equivalent to relaxed ordering.
func StoreInt64Relaxed ¶
StoreInt64Relaxed atomically stores val to *addr with relaxed memory ordering.
func StoreInt64Release ¶
StoreInt64Release atomically stores val to *addr with release memory ordering.
func StorePointerRelaxed ¶
StorePointerRelaxed atomically stores val to *addr with relaxed memory ordering.
func StorePointerRelease ¶
StorePointerRelease atomically stores val to *addr with release memory ordering.
func StoreUint128Relaxed ¶
func StoreUint128Release ¶
func StoreUint32Relaxed ¶
StoreUint32Relaxed atomically stores val to *addr with relaxed memory ordering.
func StoreUint32Release ¶
StoreUint32Release atomically stores val to *addr with release memory ordering.
func StoreUint64Relaxed ¶
StoreUint64Relaxed atomically stores val to *addr with relaxed memory ordering.
func StoreUint64Release ¶
StoreUint64Release atomically stores val to *addr with release memory ordering.
func StoreUintptrRelaxed ¶
StoreUintptrRelaxed atomically stores val to *addr with relaxed memory ordering.
func StoreUintptrRelease ¶
StoreUintptrRelease atomically stores val to *addr with release memory ordering.
func SwapInt32AcqRel ¶
func SwapInt32Acquire ¶
func SwapInt32Relaxed ¶
Swap atomically stores new and returns the old value.
func SwapInt32Release ¶
func SwapInt64AcqRel ¶
func SwapInt64Acquire ¶
func SwapInt64Relaxed ¶
func SwapInt64Release ¶
func SwapPointerAcqRel ¶
func SwapPointerAcquire ¶
func SwapPointerRelaxed ¶
func SwapPointerRelease ¶
func SwapUint128AcqRel ¶
func SwapUint128Acquire ¶
func SwapUint128Relaxed ¶
func SwapUint128Release ¶
func SwapUint32AcqRel ¶
func SwapUint32Acquire ¶
func SwapUint32Relaxed ¶
func SwapUint32Release ¶
func SwapUint64AcqRel ¶
func SwapUint64Acquire ¶
func SwapUint64Relaxed ¶
func SwapUint64Release ¶
func SwapUintptrAcqRel ¶
func SwapUintptrAcquire ¶
func SwapUintptrRelaxed ¶
func SwapUintptrRelease ¶
func XorInt32AcqRel ¶
func XorInt32Acquire ¶
func XorInt32Relaxed ¶
Xor atomically performs *addr ^= mask and returns the old value.
func XorInt32Release ¶
func XorInt64AcqRel ¶
func XorInt64Acquire ¶
func XorInt64Relaxed ¶
func XorInt64Release ¶
func XorUint32AcqRel ¶
func XorUint32Acquire ¶
func XorUint32Relaxed ¶
func XorUint32Release ¶
func XorUint64AcqRel ¶
func XorUint64Acquire ¶
func XorUint64Relaxed ¶
func XorUint64Release ¶
func XorUintptrAcqRel ¶
func XorUintptrAcquire ¶
func XorUintptrRelaxed ¶
func XorUintptrRelease ¶
Types ¶
This section is empty.