1// Copyright 2024 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package impl
6
7import (
8 "sync/atomic"
9 "unsafe"
10)
11
12func (p pointer) AtomicGetPointer() pointer {
13 return pointer{p: atomic.LoadPointer((*unsafe.Pointer)(p.p))}
14}
15
16func (p pointer) AtomicSetPointer(v pointer) {
17 atomic.StorePointer((*unsafe.Pointer)(p.p), v.p)
18}
19
20func (p pointer) AtomicSetNilPointer() {
21 atomic.StorePointer((*unsafe.Pointer)(p.p), unsafe.Pointer(nil))
22}
23
24func (p pointer) AtomicSetPointerIfNil(v pointer) pointer {
25 if atomic.CompareAndSwapPointer((*unsafe.Pointer)(p.p), unsafe.Pointer(nil), v.p) {
26 return v
27 }
28 return pointer{p: atomic.LoadPointer((*unsafe.Pointer)(p.p))}
29}
30
31type atomicV1MessageInfo struct{ p Pointer }
32
33func (mi *atomicV1MessageInfo) Get() Pointer {
34 return Pointer(atomic.LoadPointer((*unsafe.Pointer)(&mi.p)))
35}
36
37func (mi *atomicV1MessageInfo) SetIfNil(p Pointer) Pointer {
38 if atomic.CompareAndSwapPointer((*unsafe.Pointer)(&mi.p), nil, unsafe.Pointer(p)) {
39 return p
40 }
41 return mi.Get()
42}