blob: 169f793dcf39933c5512ad87f70aab0d3174972f [file] [log] [blame]
Naveen Sampath04696f72022-06-13 15:19:14 +05301// Copyright (c) 2021 Uber Technologies, Inc.
2//
3// Permission is hereby granted, free of charge, to any person obtaining a copy
4// of this software and associated documentation files (the "Software"), to deal
5// in the Software without restriction, including without limitation the rights
6// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7// copies of the Software, and to permit persons to whom the Software is
8// furnished to do so, subject to the following conditions:
9//
10// The above copyright notice and this permission notice shall be included in
11// all copies or substantial portions of the Software.
12//
13// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19// THE SOFTWARE.
20
21package atomic
22
23import (
24 "sync/atomic"
25 "unsafe"
26)
27
28// UnsafePointer is an atomic wrapper around unsafe.Pointer.
29type UnsafePointer struct {
30 _ nocmp // disallow non-atomic comparison
31
32 v unsafe.Pointer
33}
34
35// NewUnsafePointer creates a new UnsafePointer.
36func NewUnsafePointer(val unsafe.Pointer) *UnsafePointer {
37 return &UnsafePointer{v: val}
38}
39
40// Load atomically loads the wrapped value.
41func (p *UnsafePointer) Load() unsafe.Pointer {
42 return atomic.LoadPointer(&p.v)
43}
44
45// Store atomically stores the passed value.
46func (p *UnsafePointer) Store(val unsafe.Pointer) {
47 atomic.StorePointer(&p.v, val)
48}
49
50// Swap atomically swaps the wrapped unsafe.Pointer and returns the old value.
51func (p *UnsafePointer) Swap(val unsafe.Pointer) (old unsafe.Pointer) {
52 return atomic.SwapPointer(&p.v, val)
53}
54
55// CAS is an atomic compare-and-swap.
56func (p *UnsafePointer) CAS(old, new unsafe.Pointer) (swapped bool) {
57 return atomic.CompareAndSwapPointer(&p.v, old, new)
58}