summaryrefslogtreecommitdiff
path: root/libgo/go/sync
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@gcc.gnu.org>2012-11-21 07:03:38 +0000
committerIan Lance Taylor <ian@gcc.gnu.org>2012-11-21 07:03:38 +0000
commitfabcaa8df3d6eb852b87821ef090d31d222870b7 (patch)
tree72455aea0286937aa08cc141e5efc800e4626577 /libgo/go/sync
parenta51fb17f48428e7cfc96a72a9f9f87901363bb6b (diff)
libgo: Update to current version of master library.
From-SVN: r193688
Diffstat (limited to 'libgo/go/sync')
-rw-r--r--libgo/go/sync/atomic/64bit_arm.go (renamed from libgo/go/sync/atomic/64bit_linux_arm.go)0
-rw-r--r--libgo/go/sync/atomic/race.go22
2 files changed, 22 insertions, 0 deletions
diff --git a/libgo/go/sync/atomic/64bit_linux_arm.go b/libgo/go/sync/atomic/64bit_arm.go
index f070e78bd3c..f070e78bd3c 100644
--- a/libgo/go/sync/atomic/64bit_linux_arm.go
+++ b/libgo/go/sync/atomic/64bit_arm.go
diff --git a/libgo/go/sync/atomic/race.go b/libgo/go/sync/atomic/race.go
index c3627654deb..242bbf298f0 100644
--- a/libgo/go/sync/atomic/race.go
+++ b/libgo/go/sync/atomic/race.go
@@ -11,6 +11,13 @@ import (
"unsafe"
)
+// We use runtime.RaceRead() inside of atomic operations to catch races
+// between atomic and non-atomic operations. It will also catch races
+// between Mutex.Lock() and mutex overwrite (mu = Mutex{}). Since we use
+// only RaceRead() we won't catch races with non-atomic loads.
+// Otherwise (if we use RaceWrite()) we will report races
+// between atomic operations (false positives).
+
var mtx uint32 = 1 // same for all
func CompareAndSwapInt32(val *int32, old, new int32) bool {
@@ -20,6 +27,7 @@ func CompareAndSwapInt32(val *int32, old, new int32) bool {
func CompareAndSwapUint32(val *uint32, old, new uint32) (swapped bool) {
swapped = false
runtime.RaceSemacquire(&mtx)
+ runtime.RaceRead(unsafe.Pointer(val))
runtime.RaceAcquire(unsafe.Pointer(val))
if *val == old {
*val = new
@@ -37,6 +45,7 @@ func CompareAndSwapInt64(val *int64, old, new int64) bool {
func CompareAndSwapUint64(val *uint64, old, new uint64) (swapped bool) {
swapped = false
runtime.RaceSemacquire(&mtx)
+ runtime.RaceRead(unsafe.Pointer(val))
runtime.RaceAcquire(unsafe.Pointer(val))
if *val == old {
*val = new
@@ -50,6 +59,7 @@ func CompareAndSwapUint64(val *uint64, old, new uint64) (swapped bool) {
func CompareAndSwapPointer(val *unsafe.Pointer, old, new unsafe.Pointer) (swapped bool) {
swapped = false
runtime.RaceSemacquire(&mtx)
+ runtime.RaceRead(unsafe.Pointer(val))
runtime.RaceAcquire(unsafe.Pointer(val))
if *val == old {
*val = new
@@ -63,6 +73,7 @@ func CompareAndSwapPointer(val *unsafe.Pointer, old, new unsafe.Pointer) (swappe
func CompareAndSwapUintptr(val *uintptr, old, new uintptr) (swapped bool) {
swapped = false
runtime.RaceSemacquire(&mtx)
+ runtime.RaceRead(unsafe.Pointer(val))
runtime.RaceAcquire(unsafe.Pointer(val))
if *val == old {
*val = new
@@ -79,6 +90,7 @@ func AddInt32(val *int32, delta int32) int32 {
func AddUint32(val *uint32, delta uint32) (new uint32) {
runtime.RaceSemacquire(&mtx)
+ runtime.RaceRead(unsafe.Pointer(val))
runtime.RaceAcquire(unsafe.Pointer(val))
*val = *val + delta
new = *val
@@ -94,6 +106,7 @@ func AddInt64(val *int64, delta int64) int64 {
func AddUint64(val *uint64, delta uint64) (new uint64) {
runtime.RaceSemacquire(&mtx)
+ runtime.RaceRead(unsafe.Pointer(val))
runtime.RaceAcquire(unsafe.Pointer(val))
*val = *val + delta
new = *val
@@ -105,6 +118,7 @@ func AddUint64(val *uint64, delta uint64) (new uint64) {
func AddUintptr(val *uintptr, delta uintptr) (new uintptr) {
runtime.RaceSemacquire(&mtx)
+ runtime.RaceRead(unsafe.Pointer(val))
runtime.RaceAcquire(unsafe.Pointer(val))
*val = *val + delta
new = *val
@@ -120,6 +134,7 @@ func LoadInt32(addr *int32) int32 {
func LoadUint32(addr *uint32) (val uint32) {
runtime.RaceSemacquire(&mtx)
+ runtime.RaceRead(unsafe.Pointer(addr))
runtime.RaceAcquire(unsafe.Pointer(addr))
val = *addr
runtime.RaceSemrelease(&mtx)
@@ -132,6 +147,7 @@ func LoadInt64(addr *int64) int64 {
func LoadUint64(addr *uint64) (val uint64) {
runtime.RaceSemacquire(&mtx)
+ runtime.RaceRead(unsafe.Pointer(addr))
runtime.RaceAcquire(unsafe.Pointer(addr))
val = *addr
runtime.RaceSemrelease(&mtx)
@@ -140,6 +156,7 @@ func LoadUint64(addr *uint64) (val uint64) {
func LoadPointer(addr *unsafe.Pointer) (val unsafe.Pointer) {
runtime.RaceSemacquire(&mtx)
+ runtime.RaceRead(unsafe.Pointer(addr))
runtime.RaceAcquire(unsafe.Pointer(addr))
val = *addr
runtime.RaceSemrelease(&mtx)
@@ -148,6 +165,7 @@ func LoadPointer(addr *unsafe.Pointer) (val unsafe.Pointer) {
func LoadUintptr(addr *uintptr) (val uintptr) {
runtime.RaceSemacquire(&mtx)
+ runtime.RaceRead(unsafe.Pointer(addr))
runtime.RaceAcquire(unsafe.Pointer(addr))
val = *addr
runtime.RaceSemrelease(&mtx)
@@ -160,6 +178,7 @@ func StoreInt32(addr *int32, val int32) {
func StoreUint32(addr *uint32, val uint32) {
runtime.RaceSemacquire(&mtx)
+ runtime.RaceRead(unsafe.Pointer(addr))
*addr = val
runtime.RaceRelease(unsafe.Pointer(addr))
runtime.RaceSemrelease(&mtx)
@@ -171,6 +190,7 @@ func StoreInt64(addr *int64, val int64) {
func StoreUint64(addr *uint64, val uint64) {
runtime.RaceSemacquire(&mtx)
+ runtime.RaceRead(unsafe.Pointer(addr))
*addr = val
runtime.RaceRelease(unsafe.Pointer(addr))
runtime.RaceSemrelease(&mtx)
@@ -178,6 +198,7 @@ func StoreUint64(addr *uint64, val uint64) {
func StorePointer(addr *unsafe.Pointer, val unsafe.Pointer) {
runtime.RaceSemacquire(&mtx)
+ runtime.RaceRead(unsafe.Pointer(addr))
*addr = val
runtime.RaceRelease(unsafe.Pointer(addr))
runtime.RaceSemrelease(&mtx)
@@ -185,6 +206,7 @@ func StorePointer(addr *unsafe.Pointer, val unsafe.Pointer) {
func StoreUintptr(addr *uintptr, val uintptr) {
runtime.RaceSemacquire(&mtx)
+ runtime.RaceRead(unsafe.Pointer(addr))
*addr = val
runtime.RaceRelease(unsafe.Pointer(addr))
runtime.RaceSemrelease(&mtx)