1
0
mirror of https://github.com/golang/go synced 2024-11-24 17:50:15 -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:
Russ Cox 2011-07-28 21:03:40 -04:00
parent 032ffb2e90
commit bed7e3ed78
2 changed files with 17 additions and 4 deletions

View File

@ -122,6 +122,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)
hz = 0;

View File

@ -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;