1
0
mirror of https://github.com/golang/go synced 2024-11-24 23:57:57 -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:
Russ Cox 2012-02-21 16:36:15 -05:00
parent d86213c371
commit fc7ed45b35

View File

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