mirror of
https://github.com/golang/go
synced 2024-10-03 05:11:21 -06:00
7b4df8f018
Add write barrier to atomic operations manipulating pointers. In general an atomic write of a pointer word may indicate racy accesses, so there is no strictly safe way to attempt to keep the shadow copy in sync with the real one. Instead, mark the shadow copy as not used. Redirect sync/atomic pointer routines back to the runtime ones, so that there is only one copy of the write barrier and shadow logic. In time we might consider doing this for most of the sync/atomic functions, but for now only the pointer routines need that treatment. Found with GODEBUG=wbshadow=1 mode. Eventually that will run automatically, but right now it still detects other missing write barriers. Change-Id: I852936b9a111a6cb9079cfaf6bd78b43016c0242 Reviewed-on: https://go-review.googlesource.com/2066 Reviewed-by: Rick Hudson <rlh@golang.org> Reviewed-by: Austin Clements <austin@google.com>
52 lines
1.1 KiB
Go
52 lines
1.1 KiB
Go
// Copyright 2014 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
// +build ppc64 ppc64le
|
|
|
|
package runtime
|
|
|
|
import "unsafe"
|
|
|
|
//go:noescape
|
|
func xadd(ptr *uint32, delta int32) uint32
|
|
|
|
//go:noescape
|
|
func xadd64(ptr *uint64, delta int64) uint64
|
|
|
|
//go:noescape
|
|
func xchg(ptr *uint32, new uint32) uint32
|
|
|
|
//go:noescape
|
|
func xchg64(ptr *uint64, new uint64) uint64
|
|
|
|
// NO go:noescape annotation; see atomic_pointer.go.
|
|
func xchgp1(ptr unsafe.Pointer, new unsafe.Pointer) unsafe.Pointer
|
|
|
|
//go:noescape
|
|
func xchguintptr(ptr *uintptr, new uintptr) uintptr
|
|
|
|
//go:noescape
|
|
func atomicload(ptr *uint32) uint32
|
|
|
|
//go:noescape
|
|
func atomicload64(ptr *uint64) uint64
|
|
|
|
//go:noescape
|
|
func atomicloadp(ptr unsafe.Pointer) unsafe.Pointer
|
|
|
|
//go:noescape
|
|
func atomicor8(ptr *uint8, val uint8)
|
|
|
|
//go:noescape
|
|
func cas64(ptr *uint64, old, new uint64) bool
|
|
|
|
//go:noescape
|
|
func atomicstore(ptr *uint32, val uint32)
|
|
|
|
//go:noescape
|
|
func atomicstore64(ptr *uint64, val uint64)
|
|
|
|
// NO go:noescape annotation; see atomic_pointer.go.
|
|
func atomicstorep1(ptr unsafe.Pointer, val unsafe.Pointer)
|