pointer_unsafe_opaque.go

 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}