diff options
author | Andrei Vagin <avagin@google.com> | 2019-06-25 09:51:36 -0700 |
---|---|---|
committer | gVisor bot <gvisor-bot@google.com> | 2019-06-25 09:52:49 -0700 |
commit | 03ae91c662869a37ba71dd2577d4e218a3aa4669 (patch) | |
tree | c6447126fde6710b1e1cff7ea3bed1214795999e /third_party/gvsync/atomicptr_unsafe.go | |
parent | fd16a329ce0c9fa1e7dd4c0fc1edc201f4c19571 (diff) |
gvisor: lockless read access for task credentials
Credentials are immutable and even before these changes we could read them
without locks, but we needed to take a task lock to get a credential object
from a task object.
It is possible to avoid this lock, if we will guarantee that a credential
object will not be changed after setting it on a task.
PiperOrigin-RevId: 254989492
Diffstat (limited to 'third_party/gvsync/atomicptr_unsafe.go')
-rw-r--r-- | third_party/gvsync/atomicptr_unsafe.go | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/third_party/gvsync/atomicptr_unsafe.go b/third_party/gvsync/atomicptr_unsafe.go index 53a943282..525c4beed 100644 --- a/third_party/gvsync/atomicptr_unsafe.go +++ b/third_party/gvsync/atomicptr_unsafe.go @@ -21,8 +21,18 @@ type Value struct{} // 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 + 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 |