mirror of
https://github.com/golang/go
synced 2024-11-21 16:54:46 -07:00
runtime: avoid malloc during malloc
A fault during malloc might lead to the program's first call to findfunc, which would in turn call malloc. Don't do that. Fixes #1777. R=golang-dev, gri CC=golang-dev https://golang.org/cl/5689047
This commit is contained in:
parent
d86213c371
commit
fc7ed45b35
@ -437,13 +437,17 @@ runtime·findfunc(uintptr addr)
|
||||
// (Before enabling the signal handler,
|
||||
// SetCPUProfileRate calls findfunc to trigger
|
||||
// the initialization outside the handler.)
|
||||
if(runtime·atomicload(&funcinit) == 0) {
|
||||
runtime·lock(&funclock);
|
||||
if(funcinit == 0) {
|
||||
buildfuncs();
|
||||
runtime·atomicstore(&funcinit, 1);
|
||||
// Avoid deadlock on fault during malloc
|
||||
// by not calling buildfuncs if we're already in malloc.
|
||||
if(!m->mallocing && !m->gcing) {
|
||||
if(runtime·atomicload(&funcinit) == 0) {
|
||||
runtime·lock(&funclock);
|
||||
if(funcinit == 0) {
|
||||
buildfuncs();
|
||||
runtime·atomicstore(&funcinit, 1);
|
||||
}
|
||||
runtime·unlock(&funclock);
|
||||
}
|
||||
runtime·unlock(&funclock);
|
||||
}
|
||||
|
||||
if(nfunc == 0)
|
||||
|
Loading…
Reference in New Issue
Block a user