1// +build js
2
3package atomic
4
5import (
6	"unsafe"
7
8	"github.com/gopherjs/gopherjs/js"
9)
10
11func SwapInt32(addr *int32, new int32) int32 {
12	old := *addr
13	*addr = new
14	return old
15}
16
17func SwapInt64(addr *int64, new int64) int64 {
18	old := *addr
19	*addr = new
20	return old
21}
22
23func SwapUint32(addr *uint32, new uint32) uint32 {
24	old := *addr
25	*addr = new
26	return old
27}
28
29func SwapUint64(addr *uint64, new uint64) uint64 {
30	old := *addr
31	*addr = new
32	return old
33}
34
35func SwapUintptr(addr *uintptr, new uintptr) uintptr {
36	old := *addr
37	*addr = new
38	return old
39}
40
41func SwapPointer(addr *unsafe.Pointer, new unsafe.Pointer) unsafe.Pointer {
42	old := *addr
43	*addr = new
44	return old
45}
46
47func CompareAndSwapInt32(addr *int32, old, new int32) bool {
48	if *addr == old {
49		*addr = new
50		return true
51	}
52	return false
53}
54
55func CompareAndSwapInt64(addr *int64, old, new int64) bool {
56	if *addr == old {
57		*addr = new
58		return true
59	}
60	return false
61}
62
63func CompareAndSwapUint32(addr *uint32, old, new uint32) bool {
64	if *addr == old {
65		*addr = new
66		return true
67	}
68	return false
69}
70
71func CompareAndSwapUint64(addr *uint64, old, new uint64) bool {
72	if *addr == old {
73		*addr = new
74		return true
75	}
76	return false
77}
78
79func CompareAndSwapUintptr(addr *uintptr, old, new uintptr) bool {
80	if *addr == old {
81		*addr = new
82		return true
83	}
84	return false
85}
86
87func CompareAndSwapPointer(addr *unsafe.Pointer, old, new unsafe.Pointer) bool {
88	if *addr == old {
89		*addr = new
90		return true
91	}
92	return false
93}
94
95func AddInt32(addr *int32, delta int32) int32 {
96	new := *addr + delta
97	*addr = new
98	return new
99}
100
101func AddUint32(addr *uint32, delta uint32) uint32 {
102	new := *addr + delta
103	*addr = new
104	return new
105}
106
107func AddInt64(addr *int64, delta int64) int64 {
108	new := *addr + delta
109	*addr = new
110	return new
111}
112
113func AddUint64(addr *uint64, delta uint64) uint64 {
114	new := *addr + delta
115	*addr = new
116	return new
117}
118
119func AddUintptr(addr *uintptr, delta uintptr) uintptr {
120	new := *addr + delta
121	*addr = new
122	return new
123}
124
125func LoadInt32(addr *int32) int32 {
126	return *addr
127}
128
129func LoadInt64(addr *int64) int64 {
130	return *addr
131}
132
133func LoadUint32(addr *uint32) uint32 {
134	return *addr
135}
136
137func LoadUint64(addr *uint64) uint64 {
138	return *addr
139}
140
141func LoadUintptr(addr *uintptr) uintptr {
142	return *addr
143}
144
145func LoadPointer(addr *unsafe.Pointer) unsafe.Pointer {
146	return *addr
147}
148
149func StoreInt32(addr *int32, val int32) {
150	*addr = val
151}
152
153func StoreInt64(addr *int64, val int64) {
154	*addr = val
155}
156
157func StoreUint32(addr *uint32, val uint32) {
158	*addr = val
159}
160
161func StoreUint64(addr *uint64, val uint64) {
162	*addr = val
163}
164
165func StoreUintptr(addr *uintptr, val uintptr) {
166	*addr = val
167}
168
169func StorePointer(addr *unsafe.Pointer, val unsafe.Pointer) {
170	*addr = val
171}
172
173func (v *Value) Load() (x interface{}) {
174	return v.v
175}
176
177func (v *Value) Store(x interface{}) {
178	if x == nil {
179		panic("sync/atomic: store of nil value into Value")
180	}
181	if v.v != nil && js.InternalObject(x).Get("constructor") != js.InternalObject(v.v).Get("constructor") {
182		panic("sync/atomic: store of inconsistently typed value into Value")
183	}
184	v.v = x
185}
186