pointer_unsafe_opaque.go 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  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. package impl
  5. import (
  6. "sync/atomic"
  7. "unsafe"
  8. )
  9. func (p pointer) AtomicGetPointer() pointer {
  10. return pointer{p: atomic.LoadPointer((*unsafe.Pointer)(p.p))}
  11. }
  12. func (p pointer) AtomicSetPointer(v pointer) {
  13. atomic.StorePointer((*unsafe.Pointer)(p.p), v.p)
  14. }
  15. func (p pointer) AtomicSetNilPointer() {
  16. atomic.StorePointer((*unsafe.Pointer)(p.p), unsafe.Pointer(nil))
  17. }
  18. func (p pointer) AtomicSetPointerIfNil(v pointer) pointer {
  19. if atomic.CompareAndSwapPointer((*unsafe.Pointer)(p.p), unsafe.Pointer(nil), v.p) {
  20. return v
  21. }
  22. return pointer{p: atomic.LoadPointer((*unsafe.Pointer)(p.p))}
  23. }
  24. type atomicV1MessageInfo struct{ p Pointer }
  25. func (mi *atomicV1MessageInfo) Get() Pointer {
  26. return Pointer(atomic.LoadPointer((*unsafe.Pointer)(&mi.p)))
  27. }
  28. func (mi *atomicV1MessageInfo) SetIfNil(p Pointer) Pointer {
  29. if atomic.CompareAndSwapPointer((*unsafe.Pointer)(&mi.p), nil, unsafe.Pointer(p)) {
  30. return p
  31. }
  32. return mi.Get()
  33. }