github.com/ttpreport/gvisor-ligolo@v0.0.0-20240123134145-a858404967ba/pkg/sentry/kernel/futex/atomicptr_bucket_unsafe.go (about)

     1  package futex
     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 AtomicPtrBucket struct {
    17  	ptr unsafe.Pointer `state:".(*bucket)"`
    18  }
    19  
    20  func (p *AtomicPtrBucket) savePtr() *bucket {
    21  	return p.Load()
    22  }
    23  
    24  func (p *AtomicPtrBucket) loadPtr(v *bucket) {
    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 *AtomicPtrBucket) Load() *bucket {
    33  	return (*bucket)(atomic.LoadPointer(&p.ptr))
    34  }
    35  
    36  // Store sets the value returned by Load to x.
    37  func (p *AtomicPtrBucket) Store(x *bucket) {
    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 *AtomicPtrBucket) Swap(x *bucket) *bucket {
    43  	return (*bucket)(atomic.SwapPointer(&p.ptr, (unsafe.Pointer)(x)))
    44  }