1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package atomic
16
17 import (
18 "internal/cpu"
19 "unsafe"
20 )
21
22
23 var lock struct {
24 state uint32
25 pad [cpu.CacheLinePadSize - 4]byte
26 }
27
28
29 func spinLock(state *uint32)
30
31
32 func spinUnlock(state *uint32)
33
34
35 func lockAndCheck(addr *uint64) {
36
37 if uintptr(unsafe.Pointer(addr))&7 != 0 {
38 panicUnaligned()
39 }
40
41 _ = *addr
42
43 spinLock(&lock.state)
44 }
45
46
47 func unlock() {
48 spinUnlock(&lock.state)
49 }
50
51
52 func unlockNoFence() {
53 lock.state = 0
54 }
55
56
57 func Xadd64(addr *uint64, delta int64) (new uint64) {
58 lockAndCheck(addr)
59
60 new = *addr + uint64(delta)
61 *addr = new
62
63 unlock()
64 return
65 }
66
67
68 func Xchg64(addr *uint64, new uint64) (old uint64) {
69 lockAndCheck(addr)
70
71 old = *addr
72 *addr = new
73
74 unlock()
75 return
76 }
77
78
79 func Cas64(addr *uint64, old, new uint64) (swapped bool) {
80 lockAndCheck(addr)
81
82 if (*addr) == old {
83 *addr = new
84 unlock()
85 return true
86 }
87
88 unlockNoFence()
89 return false
90 }
91
92
93 func Load64(addr *uint64) (val uint64) {
94 lockAndCheck(addr)
95
96 val = *addr
97
98 unlock()
99 return
100 }
101
102
103 func Store64(addr *uint64, val uint64) {
104 lockAndCheck(addr)
105
106 *addr = val
107
108 unlock()
109 return
110 }
111
112
113 func Xadd(ptr *uint32, delta int32) uint32
114
115
116 func Xadduintptr(ptr *uintptr, delta uintptr) uintptr
117
118
119 func Xchg(ptr *uint32, new uint32) uint32
120
121
122 func Xchguintptr(ptr *uintptr, new uintptr) uintptr
123
124
125 func Load(ptr *uint32) uint32
126
127
128 func Load8(ptr *uint8) uint8
129
130
131 func Loadp(ptr unsafe.Pointer) unsafe.Pointer
132
133
134 func LoadAcq(ptr *uint32) uint32
135
136
137 func LoadAcquintptr(ptr *uintptr) uintptr
138
139
140 func And8(ptr *uint8, val uint8)
141
142
143 func Or8(ptr *uint8, val uint8)
144
145
146 func And(ptr *uint32, val uint32)
147
148
149 func Or(ptr *uint32, val uint32)
150
151
152 func Store(ptr *uint32, val uint32)
153
154
155 func Store8(ptr *uint8, val uint8)
156
157
158 func StorepNoWB(ptr unsafe.Pointer, val unsafe.Pointer)
159
160
161 func StoreRel(ptr *uint32, val uint32)
162
163
164 func StoreReluintptr(ptr *uintptr, val uintptr)
165
166
167 func CasRel(addr *uint32, old, new uint32) bool
168
View as plain text