runtime: Add memprofilerate to GODEBUG
authorIan Lance Taylor <ian@gcc.gnu.org>
Fri, 6 Feb 2015 05:03:22 +0000 (05:03 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Fri, 6 Feb 2015 05:03:22 +0000 (05:03 +0000)
Add memprofilerate as a value recognized
in the GODEBUG env var.  The value provided
is used as the new setting for
runtime.MemProfileRate, allowing the user
to adjust memory profiling.

From-SVN: r220470

libgo/go/runtime/extern.go
libgo/runtime/runtime.c

index 393984c7d577f818821a2bc30869d7d362a3fe4b..3c3e427a05a9259be59a417354f769add395cc43 100644 (file)
@@ -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.
index 6e0d164707d9c82a6d65577c21966c65a778832d..e3320356c47c142f962082c4c6d37b056382fbe7 100644 (file)
@@ -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, ",");