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  }