aboutsummaryrefslogtreecommitdiff
path: root/src/pkg/runtime
diff options
context:
space:
mode:
authorDmitriy Vyukov <dvyukov@google.com>2013-08-22 02:17:45 +0400
committerDmitriy Vyukov <dvyukov@google.com>2013-08-22 02:17:45 +0400
commitdfdd1ba028b0adc78f858850a255bcd57aabef86 (patch)
tree1bb2dd5fe477d93410ac6eef1b27c634dbbde8b0 /src/pkg/runtime
parent87fdb8fb9ab8de4e008fa7c1561b16e3df01223a (diff)
downloadgo-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.c29
-rw-r--r--src/pkg/runtime/stack.c2
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