github.com/hslam/atomic@v1.0.0/pointer.go (about) 1 // Copyright (c) 2020 Meng Huang (mhboy@outlook.com) 2 // This package is licensed under a MIT license that can be found in the LICENSE file. 3 4 package atomic 5 6 import ( 7 "sync/atomic" 8 "unsafe" 9 ) 10 11 // Pointer represents an unsafe.Pointer. 12 type Pointer struct { 13 v unsafe.Pointer 14 } 15 16 // NewPointer returns a new Pointer. 17 func NewPointer(val unsafe.Pointer) *Pointer { 18 addr := &Pointer{} 19 addr.Store(val) 20 return addr 21 } 22 23 // Swap atomically stores new into *addr and returns the previous *addr value. 24 func (addr *Pointer) Swap(new unsafe.Pointer) (old unsafe.Pointer) { 25 return atomic.SwapPointer(&addr.v, new) 26 } 27 28 // CompareAndSwap executes the compare-and-swap operation for an uint64 value. 29 func (addr *Pointer) CompareAndSwap(old, new unsafe.Pointer) (swapped bool) { 30 return atomic.CompareAndSwapPointer(&addr.v, old, new) 31 } 32 33 // Load atomically loads *addr. 34 func (addr *Pointer) Load() (val unsafe.Pointer) { 35 return atomic.LoadPointer(&addr.v) 36 } 37 38 // Store atomically stores val into *addr. 39 func (addr *Pointer) Store(val unsafe.Pointer) { 40 atomic.StorePointer(&addr.v, val) 41 }