diff options
| author | Dave Cheney <dave@cheney.net> | 2014-02-24 11:09:19 -0500 |
|---|---|---|
| committer | Russ Cox <rsc@golang.org> | 2014-02-24 11:09:19 -0500 |
| commit | dd740343e0dec4f998575a49b6a90b14db6b8749 (patch) | |
| tree | 2775ca0d796d3e8c5a18803469c8e1ba053ab1fa /src/pkg/runtime/panic.c | |
| parent | 86c976ffd094c0326c9ba2e3d47d9cc6d73084cf (diff) | |
| download | go-dd740343e0dec4f998575a49b6a90b14db6b8749.tar.xz | |
runtime: stack allocate Panic structure during runtime.panic
Update #7347
When runtime.panic is called the *Panic is malloced from the heap. This can lead to a gc cycle while panicing which can make a bad situation worse.
It appears to be possible to stack allocate the Panic and avoid malloc'ing during a panic.
Ref: https://groups.google.com/d/topic/golang-dev/OfxqpklGkh0/discussion
LGTM=minux.ma, dvyukov, rsc
R=r, minux.ma, gobot, rsc, dvyukov
CC=golang-codereviews
https://golang.org/cl/66830043
Diffstat (limited to 'src/pkg/runtime/panic.c')
| -rw-r--r-- | src/pkg/runtime/panic.c | 19 |
1 files changed, 9 insertions, 10 deletions
diff --git a/src/pkg/runtime/panic.c b/src/pkg/runtime/panic.c index 73185273cb..f4f2148d54 100644 --- a/src/pkg/runtime/panic.c +++ b/src/pkg/runtime/panic.c @@ -211,14 +211,14 @@ void runtime·panic(Eface e) { Defer *d; - Panic *p; + Panic p; void *pc, *argp; - - p = runtime·mal(sizeof *p); - p->arg = e; - p->link = g->panic; - p->stackbase = g->stackbase; - g->panic = p; + + runtime·memclr((byte*)&p, sizeof p); + p.arg = e; + p.link = g->panic; + p.stackbase = g->stackbase; + g->panic = &p; for(;;) { d = g->defer; @@ -231,11 +231,10 @@ runtime·panic(Eface e) pc = d->pc; runtime·newstackcall(d->fn, (byte*)d->args, d->siz); freedefer(d); - if(p->recovered) { - g->panic = p->link; + if(p.recovered) { + g->panic = p.link; if(g->panic == nil) // must be done with signal g->sig = 0; - runtime·free(p); // Pass information about recovering frame to recovery. g->sigcode0 = (uintptr)argp; g->sigcode1 = (uintptr)pc; |
