mirror of
https://github.com/golang/go
synced 2024-11-21 18:44:45 -07:00
gc: fix pprof deadlock
Fixes #2051. R=golang-dev, dsymonds CC=golang-dev https://golang.org/cl/4834041
This commit is contained in:
parent
032ffb2e90
commit
bed7e3ed78
@ -121,6 +121,10 @@ runtime·SetCPUProfileRate(int32 hz)
|
||||
{
|
||||
uintptr *p;
|
||||
uintptr n;
|
||||
|
||||
// Call findfunc now so that it won't have to
|
||||
// build tables during the signal handler.
|
||||
runtime·findfunc(0);
|
||||
|
||||
// Clamp hz to something reasonable.
|
||||
if(hz < 0)
|
||||
|
@ -420,10 +420,19 @@ runtime·findfunc(uintptr addr)
|
||||
Func *f;
|
||||
int32 nf, n;
|
||||
|
||||
runtime·lock(&funclock);
|
||||
if(func == nil)
|
||||
buildfuncs();
|
||||
runtime·unlock(&funclock);
|
||||
// Use atomic double-checked locking,
|
||||
// because when called from pprof signal
|
||||
// handler, findfunc must run without
|
||||
// grabbing any locks.
|
||||
// (Before enabling the signal handler,
|
||||
// SetCPUProfileRate calls findfunc to trigger
|
||||
// the initialization outside the handler.)
|
||||
if(runtime·atomicloadp(&func) == nil) {
|
||||
runtime·lock(&funclock);
|
||||
if(func == nil)
|
||||
buildfuncs();
|
||||
runtime·unlock(&funclock);
|
||||
}
|
||||
|
||||
if(nfunc == 0)
|
||||
return nil;
|
||||
|
Loading…
Reference in New Issue
Block a user