aboutsummaryrefslogtreecommitdiff
path: root/src/pkg/runtime/heapdump.c
diff options
context:
space:
mode:
authorRick Hudson <rlh@golang.org>2014-08-27 11:15:47 -0400
committerRick Hudson <rlh@golang.org>2014-08-27 11:15:47 -0400
commit0a7c7ac80e7c4ccd2b04b6b65100794adbd72ba5 (patch)
tree62e6c41d1d8bb15c2f22301aeb3e45000dae0855 /src/pkg/runtime/heapdump.c
parent56f8b297c724e43971b2b35e72bd8be9d5c0ea44 (diff)
downloadgo-0a7c7ac80e7c4ccd2b04b6b65100794adbd72ba5.tar.xz
runtime: changes to g->atomicstatus (nee status) to support concurrent GC
Every change to g->atomicstatus is now done atomically so that we can ensure that all gs pass through a gc safepoint on demand. This allows the GC to move from one phase to the next safely. In some phases the stack will be scanned. This CL only deals with the infrastructure that allows g->atomicstatus to go from one state to another. Future CLs will deal with scanning and monitoring what phase the GC is in. The major change was to moving to using a Gscan bit to indicate that the status is in a scan state. The only bug fix was in oldstack where I wasn't moving to a Gcopystack state in order to block scanning until the new stack was in place. The proc.go file is waiting for an atomic load instruction. LGTM=rsc R=golang-codereviews, dvyukov, josharian, rsc CC=golang-codereviews, khr https://golang.org/cl/132960044
Diffstat (limited to 'src/pkg/runtime/heapdump.c')
-rw-r--r--src/pkg/runtime/heapdump.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/src/pkg/runtime/heapdump.c b/src/pkg/runtime/heapdump.c
index 61f6fc2d95..ea299d0a2e 100644
--- a/src/pkg/runtime/heapdump.c
+++ b/src/pkg/runtime/heapdump.c
@@ -396,7 +396,7 @@ dumpgoroutine(G *gp)
dumpint((uintptr)sp);
dumpint(gp->goid);
dumpint(gp->gopc);
- dumpint(gp->status);
+ dumpint(runtime·readgstatus(gp));
dumpbool(gp->issystem);
dumpbool(false); // isbackground
dumpint(gp->waitsince);
@@ -442,14 +442,16 @@ dumpgs(void)
{
G *gp;
uint32 i;
+ uint32 status;
// goroutines & stacks
for(i = 0; i < runtime·allglen; i++) {
gp = runtime·allg[i];
- switch(gp->status){
+ status = runtime·readgstatus(gp); // The world is stopped so gp will not be in a scan state.
+ switch(status){
default:
- runtime·printf("unexpected G.status %d\n", gp->status);
- runtime·throw("mark - bad status");
+ runtime·printf("runtime: unexpected G.status %d\n", status);
+ runtime·throw("dumpgs in STW - bad status");
case Gdead:
break;
case Grunnable:
@@ -730,7 +732,7 @@ mdump(G *gp)
flush();
gp->param = nil;
- gp->status = Grunning;
+ runtime·casgstatus(gp, Gwaiting, Grunning);
runtime·gogo(&gp->sched);
}
@@ -751,7 +753,7 @@ runtime∕debug·WriteHeapDump(uintptr fd)
dumpfd = fd;
// Call dump routine on M stack.
- g->status = Gwaiting;
+ runtime·casgstatus(g, Grunning, Gwaiting);
g->waitreason = runtime·gostringnocopy((byte*)"dumping heap");
runtime·mcall(mdump);