diff options
author | Adin Scannell <ascannell@google.com> | 2019-11-21 11:29:49 -0800 |
---|---|---|
committer | gVisor bot <gvisor-bot@google.com> | 2019-11-21 11:41:30 -0800 |
commit | c0f89eba6ebdec08460bd796fc62d6aef674d141 (patch) | |
tree | 38b35320dc70d55e0b83d221d5c45a404f8a6683 /pkg/syncutil/atomicptr_unsafe.go | |
parent | b6a00aa375e674617f1914b90db5ddb222b5a04e (diff) |
Import and structure cleanup.
PiperOrigin-RevId: 281795269
Diffstat (limited to 'pkg/syncutil/atomicptr_unsafe.go')
-rw-r--r-- | pkg/syncutil/atomicptr_unsafe.go | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/pkg/syncutil/atomicptr_unsafe.go b/pkg/syncutil/atomicptr_unsafe.go new file mode 100644 index 000000000..525c4beed --- /dev/null +++ b/pkg/syncutil/atomicptr_unsafe.go @@ -0,0 +1,47 @@ +// Copyright 2019 The gVisor Authors. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package template doesn't exist. This file must be instantiated using the +// go_template_instance rule in tools/go_generics/defs.bzl. +package template + +import ( + "sync/atomic" + "unsafe" +) + +// Value is a required type parameter. +type Value struct{} + +// An AtomicPtr is a pointer to a value of type Value that can be atomically +// loaded and stored. The zero value of an AtomicPtr represents nil. +// +// Note that copying AtomicPtr by value performs a non-atomic read of the +// stored pointer, which is unsafe if Store() can be called concurrently; in +// this case, do `dst.Store(src.Load())` instead. +// +// +stateify savable +type AtomicPtr struct { + ptr unsafe.Pointer `state:".(*Value)"` +} + +func (p *AtomicPtr) savePtr() *Value { + return p.Load() +} + +func (p *AtomicPtr) loadPtr(v *Value) { + p.Store(v) +} + +// Load returns the value set by the most recent Store. It returns nil if there +// has been no previous call to Store. +func (p *AtomicPtr) Load() *Value { + return (*Value)(atomic.LoadPointer(&p.ptr)) +} + +// Store sets the value returned by Load to x. +func (p *AtomicPtr) Store(x *Value) { + atomic.StorePointer(&p.ptr, (unsafe.Pointer)(x)) +} |