aboutsummaryrefslogtreecommitdiff
path: root/src/sync
diff options
context:
space:
mode:
authorAustin Clements <austin@google.com>2020-10-26 14:32:13 -0400
committerAustin Clements <austin@google.com>2020-10-26 20:12:53 +0000
commitc305e49e96deafe54a8e43010ea76fead6da0a98 (patch)
tree5c41a67de0fc45e24f8014871109f6ad30fdceab /src/sync
parent22d2b984a680900ebbec6268f93a839286b6f130 (diff)
downloadgo-c305e49e96deafe54a8e43010ea76fead6da0a98.tar.gz
go-c305e49e96deafe54a8e43010ea76fead6da0a98.zip
cmd/go,cmd/compile,sync: remove special import case in cmd/go
CL 253748 introduced a special case in cmd/go to allow sync to import runtime/internal/atomic. Besides introducing unnecessary complexity into cmd/go, this breaks other packages (like gopls) that understand how imports work, but don't understand this special case. Fix this by using the more standard linkname-based approach to pull the necessary functions from runtime/internal/atomic into sync. Since these are compiler intrinsics, we also have to tell the compiler that the linknamed symbols are intrinsics to get this optimization in sync. Fixes #42196. Change-Id: I1f91498c255c91583950886a89c3c9adc39a32f0 Reviewed-on: https://go-review.googlesource.com/c/go/+/265124 Trust: Austin Clements <austin@google.com> Run-TryBot: Austin Clements <austin@google.com> Reviewed-by: Bryan C. Mills <bcmills@google.com> Reviewed-by: Keith Randall <khr@golang.org> Reviewed-by: Paul Murphy <murp@ibm.com> TryBot-Result: Go Bot <gobot@golang.org>
Diffstat (limited to 'src/sync')
-rw-r--r--src/sync/pool.go25
1 files changed, 17 insertions, 8 deletions
diff --git a/src/sync/pool.go b/src/sync/pool.go
index 137413fdc4..1ae70127ac 100644
--- a/src/sync/pool.go
+++ b/src/sync/pool.go
@@ -7,7 +7,6 @@ package sync
import (
"internal/race"
"runtime"
- runtimeatomic "runtime/internal/atomic"
"sync/atomic"
"unsafe"
)
@@ -153,8 +152,8 @@ func (p *Pool) Get() interface{} {
func (p *Pool) getSlow(pid int) interface{} {
// See the comment in pin regarding ordering of the loads.
- size := runtimeatomic.LoadAcquintptr(&p.localSize) // load-acquire
- locals := p.local // load-consume
+ size := runtime_LoadAcquintptr(&p.localSize) // load-acquire
+ locals := p.local // load-consume
// Try to steal one element from other procs.
for i := 0; i < int(size); i++ {
l := indexLocal(locals, (pid+i+1)%int(size))
@@ -166,7 +165,7 @@ func (p *Pool) getSlow(pid int) interface{} {
// Try the victim cache. We do this after attempting to steal
// from all primary caches because we want objects in the
// victim cache to age out if at all possible.
- size = runtimeatomic.Loaduintptr(&p.victimSize)
+ size = atomic.LoadUintptr(&p.victimSize)
if uintptr(pid) >= size {
return nil
}
@@ -199,8 +198,8 @@ func (p *Pool) pin() (*poolLocal, int) {
// Since we've disabled preemption, GC cannot happen in between.
// Thus here we must observe local at least as large localSize.
// We can observe a newer/larger local, it is fine (we must observe its zero-initialized-ness).
- s := runtimeatomic.LoadAcquintptr(&p.localSize) // load-acquire
- l := p.local // load-consume
+ s := runtime_LoadAcquintptr(&p.localSize) // load-acquire
+ l := p.local // load-consume
if uintptr(pid) < s {
return indexLocal(l, pid), pid
}
@@ -226,8 +225,8 @@ func (p *Pool) pinSlow() (*poolLocal, int) {
// If GOMAXPROCS changes between GCs, we re-allocate the array and lose the old one.
size := runtime.GOMAXPROCS(0)
local := make([]poolLocal, size)
- atomic.StorePointer(&p.local, unsafe.Pointer(&local[0])) // store-release
- runtimeatomic.StoreReluintptr(&p.localSize, uintptr(size)) // store-release
+ atomic.StorePointer(&p.local, unsafe.Pointer(&local[0])) // store-release
+ runtime_StoreReluintptr(&p.localSize, uintptr(size)) // store-release
return &local[pid], pid
}
@@ -283,3 +282,13 @@ func indexLocal(l unsafe.Pointer, i int) *poolLocal {
func runtime_registerPoolCleanup(cleanup func())
func runtime_procPin() int
func runtime_procUnpin()
+
+// The below are implemented in runtime/internal/atomic and the
+// compiler also knows to intrinsify the symbol we linkname into this
+// package.
+
+//go:linkname runtime_LoadAcquintptr runtime/internal/atomic.LoadAcquintptr
+func runtime_LoadAcquintptr(ptr *uintptr) uintptr
+
+//go:linkname runtime_StoreReluintptr runtime/internal/atomic.StoreReluintptr
+func runtime_StoreReluintptr(ptr *uintptr, val uintptr) uintptr