mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
runtime: do not trigger GC on g0
GC acquires worldsema, which is a goroutine-level semaphore which parks goroutines. g0 can not be parked. Fixes #6193. R=khr, khr CC=golang-dev https://golang.org/cl/12880045
This commit is contained in:
parent
87fdb8fb9a
commit
dfdd1ba028
2 changed files with 9 additions and 22 deletions
|
|
@ -1614,12 +1614,7 @@ addroots(void)
|
|||
case Gdead:
|
||||
break;
|
||||
case Grunning:
|
||||
if(gp != m->curg)
|
||||
runtime·throw("mark - world not stopped");
|
||||
if(g != m->g0)
|
||||
runtime·throw("gc not on g0");
|
||||
addstackroots(gp);
|
||||
break;
|
||||
case Grunnable:
|
||||
case Gsyscall:
|
||||
case Gwaiting:
|
||||
|
|
@ -2046,7 +2041,7 @@ runtime·gc(int32 force)
|
|||
// problems, don't bother trying to run gc
|
||||
// while holding a lock. The next mallocgc
|
||||
// without a lock will do the gc instead.
|
||||
if(!mstats.enablegc || m->locks > 0 || runtime·panicking)
|
||||
if(!mstats.enablegc || g == m->g0 || m->locks > 0 || runtime·panicking)
|
||||
return;
|
||||
|
||||
if(gcpercent == GcpercentUnknown) { // first time through
|
||||
|
|
@ -2077,16 +2072,11 @@ runtime·gc(int32 force)
|
|||
// we don't need to scan gc's internal state). Also an
|
||||
// enabler for copyable stacks.
|
||||
for(i = 0; i < (runtime·debug.gctrace > 1 ? 2 : 1); i++) {
|
||||
if(g == m->g0) {
|
||||
// already on g0
|
||||
gc(&a);
|
||||
} else {
|
||||
// switch to g0, call gc(&a), then switch back
|
||||
g->param = &a;
|
||||
g->status = Gwaiting;
|
||||
g->waitreason = "garbage collection";
|
||||
runtime·mcall(mgc);
|
||||
}
|
||||
// record a new start time in case we're going around again
|
||||
a.start_time = runtime·nanotime();
|
||||
}
|
||||
|
|
@ -2110,10 +2100,7 @@ runtime·gc(int32 force)
|
|||
}
|
||||
runtime·unlock(&finlock);
|
||||
}
|
||||
if(g->preempt) // restore the preemption request in case we've cleared it in newstack
|
||||
g->stackguard0 = StackPreempt;
|
||||
// give the queued finalizers, if any, a chance to run
|
||||
if(g != m->g0)
|
||||
runtime·gosched();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -105,7 +105,7 @@ runtime·stackalloc(uint32 n)
|
|||
m->stackinuse++;
|
||||
return v;
|
||||
}
|
||||
return runtime·mallocgc(n, 0, FlagNoProfiling|FlagNoGC|FlagNoZero);
|
||||
return runtime·mallocgc(n, 0, FlagNoProfiling|FlagNoGC|FlagNoZero|FlagNoInvokeGC);
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue