Commit 6401e0f8 authored by Keith Randall's avatar Keith Randall

runtime: don't run finalizers if we're still on the g0 stack.

R=golang-dev, rsc, dvyukov, khr
CC=golang-dev
https://golang.org/cl/11386044
parent 88ee849a
...@@ -2098,7 +2098,7 @@ runtime·gc(int32 force) ...@@ -2098,7 +2098,7 @@ runtime·gc(int32 force)
runtime·starttheworld(); runtime·starttheworld();
m->locks--; m->locks--;
// now that gc is done and we're back on g stack, kick off finalizer thread if needed // now that gc is done, kick off finalizer thread if needed
if(finq != nil) { if(finq != nil) {
runtime·lock(&finlock); runtime·lock(&finlock);
// kick off or wake up goroutine to run queued finalizers // kick off or wake up goroutine to run queued finalizers
...@@ -2109,11 +2109,12 @@ runtime·gc(int32 force) ...@@ -2109,11 +2109,12 @@ runtime·gc(int32 force)
runtime·ready(fing); runtime·ready(fing);
} }
runtime·unlock(&finlock); runtime·unlock(&finlock);
// give the queued finalizers, if any, a chance to run
runtime·gosched();
} }
if(g->preempt) // restore the preemption request in case we've cleared it in newstack if(g->preempt) // restore the preemption request in case we've cleared it in newstack
g->stackguard0 = StackPreempt; g->stackguard0 = StackPreempt;
// give the queued finalizers, if any, a chance to run
if(g != m->g0)
runtime·gosched();
} }
static void static void
......
...@@ -105,7 +105,7 @@ runtime·stackalloc(uint32 n) ...@@ -105,7 +105,7 @@ runtime·stackalloc(uint32 n)
m->stackinuse++; m->stackinuse++;
return v; return v;
} }
return runtime·mallocgc(n, 0, FlagNoProfiling|FlagNoGC|FlagNoZero|FlagNoInvokeGC); return runtime·mallocgc(n, 0, FlagNoProfiling|FlagNoGC|FlagNoZero);
} }
void void
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment