123456789101112131415161718192021222324252627282930313233343536373839404142 |
- // Copyright 2024 The Go Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style
- // license that can be found in the LICENSE file.
- package impl
- import (
- "sync/atomic"
- "unsafe"
- )
- func (p pointer) AtomicGetPointer() pointer {
- return pointer{p: atomic.LoadPointer((*unsafe.Pointer)(p.p))}
- }
- func (p pointer) AtomicSetPointer(v pointer) {
- atomic.StorePointer((*unsafe.Pointer)(p.p), v.p)
- }
- func (p pointer) AtomicSetNilPointer() {
- atomic.StorePointer((*unsafe.Pointer)(p.p), unsafe.Pointer(nil))
- }
- func (p pointer) AtomicSetPointerIfNil(v pointer) pointer {
- if atomic.CompareAndSwapPointer((*unsafe.Pointer)(p.p), unsafe.Pointer(nil), v.p) {
- return v
- }
- return pointer{p: atomic.LoadPointer((*unsafe.Pointer)(p.p))}
- }
- type atomicV1MessageInfo struct{ p Pointer }
- func (mi *atomicV1MessageInfo) Get() Pointer {
- return Pointer(atomic.LoadPointer((*unsafe.Pointer)(&mi.p)))
- }
- func (mi *atomicV1MessageInfo) SetIfNil(p Pointer) Pointer {
- if atomic.CompareAndSwapPointer((*unsafe.Pointer)(&mi.p), nil, unsafe.Pointer(p)) {
- return p
- }
- return mi.Get()
- }
|