func StoreUintptr(addr *uintptr, val uintptr) { runtime.RaceSemacquire(&mtx) runtime.RaceRead(unsafe.Pointer(addr)) *addr = val runtime.RaceRelease(unsafe.Pointer(addr)) runtime.RaceSemrelease(&mtx) }
func LoadUintptr(addr *uintptr) (val uintptr) { runtime.RaceSemacquire(&mtx) runtime.RaceRead(unsafe.Pointer(addr)) runtime.RaceAcquire(unsafe.Pointer(addr)) val = *addr runtime.RaceSemrelease(&mtx) return }
func StorePointer(addr *unsafe.Pointer, val unsafe.Pointer) { _ = *addr runtime.RaceSemacquire(&mtx) runtime.RaceRead(unsafe.Pointer(addr)) *addr = val runtime.RaceRelease(unsafe.Pointer(addr)) runtime.RaceSemrelease(&mtx) }
func AddUint32(val *uint32, delta uint32) (new uint32) { runtime.RaceSemacquire(&mtx) runtime.RaceRead(unsafe.Pointer(val)) runtime.RaceAcquire(unsafe.Pointer(val)) *val = *val + delta new = *val runtime.RaceReleaseMerge(unsafe.Pointer(val)) runtime.RaceSemrelease(&mtx) return }
func SwapPointer(addr *unsafe.Pointer, new unsafe.Pointer) (old unsafe.Pointer) { _ = *addr runtime.RaceSemacquire(&mtx) runtime.RaceRead(unsafe.Pointer(addr)) runtime.RaceAcquire(unsafe.Pointer(addr)) old = *addr *addr = new runtime.RaceReleaseMerge(unsafe.Pointer(addr)) runtime.RaceSemrelease(&mtx) return }
func CompareAndSwapUintptr(val *uintptr, old, new uintptr) (swapped bool) { swapped = false runtime.RaceSemacquire(&mtx) runtime.RaceRead(unsafe.Pointer(val)) runtime.RaceAcquire(unsafe.Pointer(val)) if *val == old { *val = new swapped = true runtime.RaceReleaseMerge(unsafe.Pointer(val)) } runtime.RaceSemrelease(&mtx) return }
func Read(addr unsafe.Pointer) { runtime.RaceRead(addr) }