1
0
mirror of https://github.com/golang/go synced 2024-11-18 14:14:46 -07:00

runtime: disable preemption during deferreturn

Deferreturn is synthesizing a new call frame.
It must not be interrupted between copying the args there
and fixing up the program counter, or else the stack will
be in an inconsistent state, one that will confuse the
garbage collector.

R=golang-dev, dvyukov
CC=golang-dev
https://golang.org/cl/11522043
This commit is contained in:
Russ Cox 2013-07-18 12:26:47 -04:00
parent 8166b2da19
commit ef12bbfc9d

View File

@ -175,10 +175,19 @@ runtime·deferreturn(uintptr arg0, ...)
argp = (byte*)&arg0;
if(d->argp != argp)
return;
// Moving arguments around.
// Do not allow preemption here, because the garbage collector
// won't know the form of the arguments until the jmpdefer can
// flip the PC over to fn.
m->locks++;
runtime·memmove(argp, d->args, d->siz);
fn = d->fn;
popdefer();
freedefer(d);
m->locks--;
if(m->locks == 0 && g->preempt)
g->stackguard0 = StackPreempt;
runtime·jmpdefer(fn, argp);
}