Commit 99e9bac8 authored by Dmitriy Vyukov's avatar Dmitriy Vyukov

runtime: init GC later

Init GC later as it needs to read GOGC env var.
Fixes #8562.

LGTM=daniel.morsing, rsc
R=golang-codereviews, daniel.morsing, rsc
CC=golang-codereviews, khr, rlh
https://golang.org/cl/130990043
parent a0dbbeae
...@@ -22,6 +22,8 @@ runtime·getenv(int8 *s) ...@@ -22,6 +22,8 @@ runtime·getenv(int8 *s)
bs = (byte*)s; bs = (byte*)s;
len = runtime·findnull(bs); len = runtime·findnull(bs);
envv = (String*)syscall·envs.array; envv = (String*)syscall·envs.array;
if(envv == nil)
runtime·throw("getenv before env init");
envc = syscall·envs.len; envc = syscall·envs.len;
for(i=0; i<envc; i++){ for(i=0; i<envc; i++){
if(envv[i].len <= len) if(envv[i].len <= len)
......
...@@ -158,7 +158,6 @@ runtime·schedinit(void) ...@@ -158,7 +158,6 @@ runtime·schedinit(void)
runtime·symtabinit(); runtime·symtabinit();
runtime·stackinit(); runtime·stackinit();
runtime·mallocinit(); runtime·mallocinit();
runtime·gcinit();
runtime·chaninit(); runtime·chaninit();
mcommoninit(g->m); mcommoninit(g->m);
...@@ -168,13 +167,10 @@ runtime·schedinit(void) ...@@ -168,13 +167,10 @@ runtime·schedinit(void)
// need to allocated memory. // need to allocated memory.
runtime·newErrorCString(0, &i); runtime·newErrorCString(0, &i);
// Initialize the cached gotraceback value, since
// gotraceback calls getenv, which mallocs on Plan 9.
runtime·gotraceback(nil);
runtime·goargs(); runtime·goargs();
runtime·goenvs(); runtime·goenvs();
runtime·parsedebugvars(); runtime·parsedebugvars();
runtime·gcinit();
runtime·sched.lastpoll = runtime·nanotime(); runtime·sched.lastpoll = runtime·nanotime();
procs = 1; procs = 1;
......
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
// The cached value is a uint32 in which the low bit // The cached value is a uint32 in which the low bit
// is the "crash" setting and the top 31 bits are the // is the "crash" setting and the top 31 bits are the
// gotraceback value. // gotraceback value.
static uint32 traceback_cache = ~(uint32)0; static uint32 traceback_cache = 2<<1;
// The GOTRACEBACK environment variable controls the // The GOTRACEBACK environment variable controls the
// behavior of a Go program that is crashing and exiting. // behavior of a Go program that is crashing and exiting.
...@@ -23,29 +23,13 @@ static uint32 traceback_cache = ~(uint32)0; ...@@ -23,29 +23,13 @@ static uint32 traceback_cache = ~(uint32)0;
int32 int32
runtime·gotraceback(bool *crash) runtime·gotraceback(bool *crash)
{ {
byte *p;
uint32 x;
if(crash != nil) if(crash != nil)
*crash = false; *crash = false;
if(g->m->traceback != 0) if(g->m->traceback != 0)
return g->m->traceback; return g->m->traceback;
x = runtime·atomicload(&traceback_cache);
if(x == ~(uint32)0) {
p = runtime·getenv("GOTRACEBACK");
if(p == nil)
p = (byte*)"";
if(p[0] == '\0')
x = 1<<1;
else if(runtime·strcmp(p, (byte*)"crash") == 0)
x = (2<<1) | 1;
else
x = runtime·atoi(p)<<1;
runtime·atomicstore(&traceback_cache, x);
}
if(crash != nil) if(crash != nil)
*crash = x&1; *crash = traceback_cache&1;
return x>>1; return traceback_cache>>1;
} }
int32 int32
...@@ -134,8 +118,6 @@ runtime·goenvs_unix(void) ...@@ -134,8 +118,6 @@ runtime·goenvs_unix(void)
syscall·envs.array = (byte*)s; syscall·envs.array = (byte*)s;
syscall·envs.len = n; syscall·envs.len = n;
syscall·envs.cap = n; syscall·envs.cap = n;
traceback_cache = ~(uint32)0;
} }
int32 int32
...@@ -354,6 +336,16 @@ runtime·parsedebugvars(void) ...@@ -354,6 +336,16 @@ runtime·parsedebugvars(void)
break; break;
p++; p++;
} }
p = runtime·getenv("GOTRACEBACK");
if(p == nil)
p = (byte*)"";
if(p[0] == '\0')
traceback_cache = 1<<1;
else if(runtime·strcmp(p, (byte*)"crash") == 0)
traceback_cache = (2<<1) | 1;
else
traceback_cache = runtime·atoi(p)<<1;
} }
// Poor mans 64-bit division. // Poor mans 64-bit division.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment