| | |
| | |
| | |
| |
|
| | |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | package atomic |
| |
|
| | import ( |
| | "internal/cpu" |
| | "unsafe" |
| | ) |
| |
|
| | |
| | var lock struct { |
| | state uint32 |
| | pad [cpu.CacheLinePadSize - 4]byte |
| | } |
| |
|
| | |
| | func spinLock(state *uint32) |
| |
|
| | |
| | func spinUnlock(state *uint32) |
| |
|
| | |
| | func lockAndCheck(addr *uint64) { |
| | |
| | if uintptr(unsafe.Pointer(addr))&7 != 0 { |
| | panicUnaligned() |
| | } |
| | |
| | _ = *addr |
| |
|
| | spinLock(&lock.state) |
| | } |
| |
|
| | |
| | func unlock() { |
| | spinUnlock(&lock.state) |
| | } |
| |
|
| | |
| | func Xadd64(addr *uint64, delta int64) (new uint64) { |
| | lockAndCheck(addr) |
| |
|
| | new = *addr + uint64(delta) |
| | *addr = new |
| |
|
| | unlock() |
| | return |
| | } |
| |
|
| | |
| | func Xchg64(addr *uint64, new uint64) (old uint64) { |
| | lockAndCheck(addr) |
| |
|
| | old = *addr |
| | *addr = new |
| |
|
| | unlock() |
| | return |
| | } |
| |
|
| | |
| | func Cas64(addr *uint64, old, new uint64) (swapped bool) { |
| | lockAndCheck(addr) |
| |
|
| | if (*addr) == old { |
| | *addr = new |
| | unlock() |
| | return true |
| | } |
| |
|
| | unlock() |
| | return false |
| | } |
| |
|
| | |
| | func Load64(addr *uint64) (val uint64) { |
| | lockAndCheck(addr) |
| |
|
| | val = *addr |
| |
|
| | unlock() |
| | return |
| | } |
| |
|
| | |
| | func Store64(addr *uint64, val uint64) { |
| | lockAndCheck(addr) |
| |
|
| | *addr = val |
| |
|
| | unlock() |
| | return |
| | } |
| |
|
| | |
| | func Or64(addr *uint64, val uint64) (old uint64) { |
| | for { |
| | old = *addr |
| | if Cas64(addr, old, old|val) { |
| | return old |
| | } |
| | } |
| | } |
| |
|
| | |
| | func And64(addr *uint64, val uint64) (old uint64) { |
| | for { |
| | old = *addr |
| | if Cas64(addr, old, old&val) { |
| | return old |
| | } |
| | } |
| | } |
| |
|
| | |
| | func Xadd(ptr *uint32, delta int32) uint32 |
| |
|
| | |
| | func Xadduintptr(ptr *uintptr, delta uintptr) uintptr |
| |
|
| | |
| | func Xchg(ptr *uint32, new uint32) uint32 |
| |
|
| | |
| | func Xchg8(ptr *uint8, new uint8) uint8 |
| |
|
| | |
| | func Xchguintptr(ptr *uintptr, new uintptr) uintptr |
| |
|
| | |
| | func Load(ptr *uint32) uint32 |
| |
|
| | |
| | func Load8(ptr *uint8) uint8 |
| |
|
| | |
| | func Loadp(ptr unsafe.Pointer) unsafe.Pointer |
| |
|
| | |
| | func LoadAcq(ptr *uint32) uint32 |
| |
|
| | |
| | func LoadAcquintptr(ptr *uintptr) uintptr |
| |
|
| | |
| | func And8(ptr *uint8, val uint8) |
| |
|
| | |
| | func Or8(ptr *uint8, val uint8) |
| |
|
| | |
| | func And(ptr *uint32, val uint32) |
| |
|
| | |
| | func Or(ptr *uint32, val uint32) |
| |
|
| | |
| | func And32(ptr *uint32, val uint32) uint32 |
| |
|
| | |
| | func Or32(ptr *uint32, val uint32) uint32 |
| |
|
| | |
| | func Anduintptr(ptr *uintptr, val uintptr) uintptr |
| |
|
| | |
| | func Oruintptr(ptr *uintptr, val uintptr) uintptr |
| |
|
| | |
| | func Store(ptr *uint32, val uint32) |
| |
|
| | |
| | func Store8(ptr *uint8, val uint8) |
| |
|
| | |
| | func StorepNoWB(ptr unsafe.Pointer, val unsafe.Pointer) |
| |
|
| | |
| | func StoreRel(ptr *uint32, val uint32) |
| |
|
| | |
| | func StoreReluintptr(ptr *uintptr, val uintptr) |
| |
|
| | |
| | func CasRel(addr *uint32, old, new uint32) bool |
| |
|