1
2
3
4
5 package atomic
6
7 import (
8 "internal/goarch"
9 "unsafe"
10 )
11
12
13 func goXchg8(addr *uint8, v uint8) uint8 {
14
15 addr32 := (*uint32)(unsafe.Pointer(uintptr(unsafe.Pointer(addr)) &^ 3))
16 shift := (uintptr(unsafe.Pointer(addr)) & 3)
17 if goarch.BigEndian {
18 shift = shift ^ 3
19 }
20 shift = shift * 8
21 word := uint32(v) << shift
22 mask := uint32(0xFF) << shift
23
24 for {
25 old := *addr32
26
27 if Cas(addr32, old, (old&^mask)|word) {
28
29 return uint8((old & mask) >> shift)
30 }
31 }
32 }
33
View as plain text