diff options
| author | Dmitriy Vyukov <dvyukov@google.com> | 2013-08-22 02:17:45 +0400 |
|---|---|---|
| committer | Dmitriy Vyukov <dvyukov@google.com> | 2013-08-22 02:17:45 +0400 |
| commit | dfdd1ba028b0adc78f858850a255bcd57aabef86 (patch) | |
| tree | 1bb2dd5fe477d93410ac6eef1b27c634dbbde8b0 /src/pkg/runtime | |
| parent | 87fdb8fb9ab8de4e008fa7c1561b16e3df01223a (diff) | |
| download | go-dfdd1ba028b0adc78f858850a255bcd57aabef86.tar.xz | |
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
Diffstat (limited to 'src/pkg/runtime')
| -rw-r--r-- | src/pkg/runtime/mgc0.c | 29 | ||||
| -rw-r--r-- | src/pkg/runtime/stack.c | 2 |
2 files changed, 9 insertions, 22 deletions
diff --git a/src/pkg/runtime/mgc0.c b/src/pkg/runtime/mgc0.c index 7b4c6a8ba1..cedf199641 100644 --- a/src/pkg/runtime/mgc0.c +++ b/src/pkg/runtime/mgc0.c @@ -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; + runtime·throw("mark - world not stopped"); 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); - } + // 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,11 +2100,8 @@ 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(); + runtime·gosched(); } static void diff --git a/src/pkg/runtime/stack.c b/src/pkg/runtime/stack.c index 32d6fd4650..dd823705da 100644 --- a/src/pkg/runtime/stack.c +++ b/src/pkg/runtime/stack.c @@ -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 |
