diff options
author | Russ Cox <rsc@golang.org> | 2014-11-10 14:59:36 -0500 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2014-11-10 14:59:36 -0500 |
commit | f4d66a3a39bd302d7fd96fc98c086813cfdaf755 (patch) | |
tree | 1a1f26ce3a138dfa3aa70f9e11a2838ec2a4eb7b /src/runtime/atomic.go | |
parent | 11c9da27d8b3d09835a611edea424885af1ec650 (diff) | |
download | go-f4d66a3a39bd302d7fd96fc98c086813cfdaf755.tar.gz |
[dev.garbage] runtime: add write barrier to casp
Also rewrite some casp that don't use real pointers
to use casuintptr instead.
LGTM=rlh
R=rlh
CC=golang-codereviews
https://codereview.appspot.com/166440044
Diffstat (limited to 'src/runtime/atomic.go')
-rw-r--r-- | src/runtime/atomic.go | 38 |
1 files changed, 34 insertions, 4 deletions
diff --git a/src/runtime/atomic.go b/src/runtime/atomic.go index 7e9d9b3aa..a0e4d84e9 100644 --- a/src/runtime/atomic.go +++ b/src/runtime/atomic.go @@ -20,8 +20,16 @@ func xchg(ptr *uint32, new uint32) uint32 //go:noescape func xchg64(ptr *uint64, new uint64) uint64 -//go:noescape -func xchgp(ptr unsafe.Pointer, new unsafe.Pointer) unsafe.Pointer +// Cannot use noescape here: ptr does not but new does escape. +// Instead use noescape(ptr) in wrapper below. +func xchgp1(ptr unsafe.Pointer, new unsafe.Pointer) unsafe.Pointer + +//go:nosplit +func xchgp(ptr unsafe.Pointer, new unsafe.Pointer) unsafe.Pointer { + old := xchgp1(noescape(ptr), new) + writebarrierptr_nostore((*uintptr)(ptr), uintptr(new)) + return old +} //go:noescape func xchguintptr(ptr *uintptr, new uintptr) uintptr @@ -47,5 +55,27 @@ func atomicstore(ptr *uint32, val uint32) //go:noescape func atomicstore64(ptr *uint64, val uint64) -//go:noescape -func atomicstorep(ptr unsafe.Pointer, val unsafe.Pointer) +// Cannot use noescape here: ptr does not but val does escape. +// Instead use noescape(ptr) in wrapper below. +func atomicstorep1(ptr unsafe.Pointer, val unsafe.Pointer) + +//go:nosplit +func atomicstorep(ptr unsafe.Pointer, val unsafe.Pointer) { + atomicstorep1(noescape(ptr), val) + // TODO(rsc): Why does the compiler think writebarrierptr_nostore's dst argument escapes? + writebarrierptr_nostore((*uintptr)(noescape(ptr)), uintptr(val)) +} + +// Cannot use noescape here: ptr does not but new does escape. +// Instead use noescape(ptr) in wrapper below. +func casp1(ptr *unsafe.Pointer, old, new unsafe.Pointer) bool + +//go:nosplit +func casp(ptr *unsafe.Pointer, old, new unsafe.Pointer) bool { + ok := casp1((*unsafe.Pointer)(noescape(unsafe.Pointer(ptr))), old, new) + if !ok { + return false + } + writebarrierptr_nostore((*uintptr)(unsafe.Pointer(ptr)), uintptr(new)) + return true +} |