aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Donovan <adonovan@google.com>2014-05-02 13:06:58 -0400
committerAlan Donovan <adonovan@google.com>2014-05-02 13:06:58 -0400
commit28c515f40faba1cd1589dcc3f6f0fe3e2f5f6325 (patch)
treed96ff06430c2ed9938f1af84e2a2e0a217624352
parent8afa086ce67b44abb9c9639efca214db7acf7b3f (diff)
downloadgo-28c515f40faba1cd1589dcc3f6f0fe3e2f5f6325.tar.xz
runtime: fix bug in GOTRACEBACK=crash causing suppression of core dumps.
Because gotraceback is called early and often, its cache commits to the value of getenv("GOTRACEBACK") before getenv is even ready. So now we reset its cache once getenv becomes ready. Panicking programs now dump core again. LGTM=rsc R=rsc CC=golang-codereviews https://golang.org/cl/97800045
-rw-r--r--src/pkg/runtime/runtime.c19
1 files changed, 11 insertions, 8 deletions
diff --git a/src/pkg/runtime/runtime.c b/src/pkg/runtime/runtime.c
index 725c6d838e..3a4f7199ed 100644
--- a/src/pkg/runtime/runtime.c
+++ b/src/pkg/runtime/runtime.c
@@ -11,6 +11,13 @@ enum {
maxround = sizeof(uintptr),
};
+// Keep a cached value to make gotraceback fast,
+// since we call it on every call to gentraceback.
+// The cached value is a uint32 in which the low bit
+// is the "crash" setting and the top 31 bits are the
+// gotraceback value.
+static uint32 traceback_cache = ~(uint32)0;
+
// The GOTRACEBACK environment variable controls the
// behavior of a Go program that is crashing and exiting.
// GOTRACEBACK=0 suppress all tracebacks
@@ -20,12 +27,6 @@ enum {
int32
runtime·gotraceback(bool *crash)
{
- // Keep a cached value to make gotraceback fast,
- // since we call it on every call to gentraceback.
- // The cached value is a uint32 in which the low bit
- // is the "crash" setting and the top 31 bits are the
- // gotraceback value.
- static uint32 cache = ~(uint32)0;
byte *p;
uint32 x;
@@ -33,7 +34,7 @@ runtime·gotraceback(bool *crash)
*crash = false;
if(m->traceback != 0)
return m->traceback;
- x = runtime·atomicload(&cache);
+ x = runtime·atomicload(&traceback_cache);
if(x == ~(uint32)0) {
p = runtime·getenv("GOTRACEBACK");
if(p == nil)
@@ -44,7 +45,7 @@ runtime·gotraceback(bool *crash)
x = (2<<1) | 1;
else
x = runtime·atoi(p)<<1;
- runtime·atomicstore(&cache, x);
+ runtime·atomicstore(&traceback_cache, x);
}
if(crash != nil)
*crash = x&1;
@@ -137,6 +138,8 @@ runtime·goenvs_unix(void)
syscall·envs.array = (byte*)s;
syscall·envs.len = n;
syscall·envs.cap = n;
+
+ traceback_cache = ~(uint32)0;
}
int32