diff --git a/src/runtime/proc.go b/src/runtime/proc.go index 3897731164..bf7835eb19 100644 --- a/src/runtime/proc.go +++ b/src/runtime/proc.go @@ -295,7 +295,7 @@ func gopark(unlockf func(*g, unsafe.Pointer) bool, lock unsafe.Pointer, reason w throw("gopark: bad g status") } mp.waitlock = lock - mp.waitunlockf = *(*unsafe.Pointer)(unsafe.Pointer(&unlockf)) + mp.waitunlockf = unlockf gp.waitreason = reason mp.waittraceev = traceEv mp.waittraceskip = traceskip @@ -2595,8 +2595,7 @@ func park_m(gp *g) { casgstatus(gp, _Grunning, _Gwaiting) dropg() - if _g_.m.waitunlockf != nil { - fn := *(*func(*g, unsafe.Pointer) bool)(unsafe.Pointer(&_g_.m.waitunlockf)) + if fn := _g_.m.waitunlockf; fn != nil { ok := fn(gp, _g_.m.waitlock) _g_.m.waitunlockf = nil _g_.m.waitlock = nil diff --git a/src/runtime/runtime2.go b/src/runtime/runtime2.go index 51bec24de5..d2f9831f20 100644 --- a/src/runtime/runtime2.go +++ b/src/runtime/runtime2.go @@ -491,11 +491,11 @@ type m struct { schedlink muintptr mcache *mcache lockedg guintptr - createstack [32]uintptr // stack that created this thread. - lockedExt uint32 // tracking for external LockOSThread - lockedInt uint32 // tracking for internal lockOSThread - nextwaitm muintptr // next m waiting for lock - waitunlockf unsafe.Pointer // todo go func(*g, unsafe.pointer) bool + createstack [32]uintptr // stack that created this thread. + lockedExt uint32 // tracking for external LockOSThread + lockedInt uint32 // tracking for internal lockOSThread + nextwaitm muintptr // next m waiting for lock + waitunlockf func(*g, unsafe.Pointer) bool waitlock unsafe.Pointer waittraceev byte waittraceskip int