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:
parent
8166b2da19
commit
ef12bbfc9d
@ -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);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user