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