diff --git a/libgo/go/runtime/extern.go b/libgo/go/runtime/extern.go index 393984c7d57..3c3e427a05a 100644 --- a/libgo/go/runtime/extern.go +++ b/libgo/go/runtime/extern.go @@ -39,6 +39,10 @@ a comma-separated list of name=val pairs. Supported names are: gcdead: setting gcdead=1 causes the garbage collector to clobber all stack slots that it thinks are dead. + memprofilerate: setting memprofilerate=X changes the setting for + runtime.MemProfileRate. Refer to the description of this variable for how + it is used and its default value. + scheddetail: setting schedtrace=X and scheddetail=1 causes the scheduler to emit detailed multiline info every X milliseconds, describing state of the scheduler, processors, threads and goroutines. diff --git a/libgo/runtime/runtime.c b/libgo/runtime/runtime.c index 6e0d164707d..e3320356c47 100644 --- a/libgo/runtime/runtime.c +++ b/libgo/runtime/runtime.c @@ -22,6 +22,10 @@ enum { // gotraceback value. static uint32 traceback_cache = ~(uint32)0; +extern volatile intgo runtime_MemProfileRate + __asm__ (GOSYM_PREFIX "runtime.MemProfileRate"); + + // The GOTRACEBACK environment variable controls the // behavior of a Go program that is crashing and exiting. // GOTRACEBACK=0 suppress all tracebacks @@ -315,6 +319,11 @@ runtime_signalstack(byte *p, int32 n) DebugVars runtime_debug; +// Holds variables parsed from GODEBUG env var, +// except for "memprofilerate" since there is an +// existing var for that value which is int +// instead of in32 and might have an +// initial value. static struct { const char* name; int32* value; @@ -349,7 +358,12 @@ runtime_parsedebugvars(void) for(;;) { for(i=0; i<(intgo)nelem(dbgvar); i++) { n = runtime_findnull((const byte*)dbgvar[i].name); - if(runtime_mcmp(p, dbgvar[i].name, n) == 0 && p[n] == '=') + if(runtime_mcmp(p, "memprofilerate", n) == 0 && p[n] == '=') + // Set the MemProfileRate directly since it + // is an int, not int32, and should only lbe + // set here if specified by GODEBUG + runtime_MemProfileRate = runtime_atoi(p+n+1); + else if(runtime_mcmp(p, dbgvar[i].name, n) == 0 && p[n] == '=') *dbgvar[i].value = runtime_atoi(p+n+1); } p = (const byte *)runtime_strstr((const char *)p, ",");