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