runtime: introduce, use funcPC to convert Go func to PC
This removes the ** unsafe hack.
Real bug fixed at chan.go:101.
LGTM=dave, r, iant
R=golang-codereviews, dave, r, iant
CC=dvyukov, golang-codereviews, khr
https://golang.org/cl/140870044
diff --git a/src/pkg/runtime/select.go b/src/pkg/runtime/select.go
index dbe0543..6d2531e 100644
--- a/src/pkg/runtime/select.go
+++ b/src/pkg/runtime/select.go
@@ -13,17 +13,10 @@
)
var (
- chansendpc uintptr
- chanrecvpc uintptr
+ chansendpc = funcPC(chansend)
+ chanrecvpc = funcPC(chanrecv)
)
-func init() {
- f := chansend
- chansendpc = **(**uintptr)(unsafe.Pointer(&f))
- g := chanrecv
- chanrecvpc = **(**uintptr)(unsafe.Pointer(&g))
-}
-
func selectsize(size uintptr) uintptr {
selsize := unsafe.Sizeof(_select{}) +
(size-1)*unsafe.Sizeof(_select{}.scase[0]) +
@@ -286,7 +279,6 @@
k *scase
sglist *sudog
sgnext *sudog
- fn func(*g, *_select) bool
)
loop:
@@ -371,8 +363,7 @@
// wait for someone to wake us up
gp.param = nil
- fn = selparkcommit
- gopark(**(**unsafe.Pointer)(unsafe.Pointer(&fn)), unsafe.Pointer(sel), "select")
+ gopark(unsafe.Pointer(funcPC(selparkcommit)), unsafe.Pointer(sel), "select")
// someone woke us up
sellock(sel)