github.com/MerlinKodo/gvisor@v0.0.0-20231110090155-957f62ecf90e/pkg/sentry/platform/kvm/atomicptr_machine_unsafe.go (about)

     1  package kvm
     2  
     3  import (
     4  	"sync/atomic"
     5  	"unsafe"
     6  )
     7  
     8  // An AtomicPtr is a pointer to a value of type Value that can be atomically
     9  // loaded and stored. The zero value of an AtomicPtr represents nil.
    10  //
    11  // Note that copying AtomicPtr by value performs a non-atomic read of the
    12  // stored pointer, which is unsafe if Store() can be called concurrently; in
    13  // this case, do `dst.Store(src.Load())` instead.
    14  //
    15  // +stateify savable
    16  type machineAtomicPtr struct {
    17  	ptr unsafe.Pointer `state:".(*machine)"`
    18  }
    19  
    20  func (p *machineAtomicPtr) savePtr() *machine {
    21  	return p.Load()
    22  }
    23  
    24  func (p *machineAtomicPtr) loadPtr(v *machine) {
    25  	p.Store(v)
    26  }
    27  
    28  // Load returns the value set by the most recent Store. It returns nil if there
    29  // has been no previous call to Store.
    30  //
    31  //go:nosplit
    32  func (p *machineAtomicPtr) Load() *machine {
    33  	return (*machine)(atomic.LoadPointer(&p.ptr))
    34  }
    35  
    36  // Store sets the value returned by Load to x.
    37  func (p *machineAtomicPtr) Store(x *machine) {
    38  	atomic.StorePointer(&p.ptr, (unsafe.Pointer)(x))
    39  }
    40  
    41  // Swap atomically stores `x` into *p and returns the previous *p value.
    42  func (p *machineAtomicPtr) Swap(x *machine) *machine {
    43  	return (*machine)(atomic.SwapPointer(&p.ptr, (unsafe.Pointer)(x)))
    44  }