]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: shrink stacks in parallel
authorDmitriy Vyukov <dvyukov@google.com>
Thu, 7 Aug 2014 08:55:28 +0000 (12:55 +0400)
committerDmitriy Vyukov <dvyukov@google.com>
Thu, 7 Aug 2014 08:55:28 +0000 (12:55 +0400)
Shrinkstack does not touch normal heap anymore,
so we can shink stacks concurrently with marking.

LGTM=khr
R=golang-codereviews, khr
CC=golang-codereviews, khr, rlh, rsc
https://golang.org/cl/122130043

src/pkg/runtime/mgc0.c

index 01e055cf04e809d2150f4915e8417593a552bbcf..16d616b3f6e0a521cc2d968056bdde31530efacb 100644 (file)
@@ -559,6 +559,8 @@ markroot(ParFor *desc, uint32 i)
                // needed only to output in traceback
                if((gp->status == Gwaiting || gp->status == Gsyscall) && gp->waitsince == 0)
                        gp->waitsince = work.tstart;
+               // Shrink a stack if not much of it is being used.
+               runtime·shrinkstack(gp);
                scanstack(gp);
                break;
                
@@ -1391,7 +1393,6 @@ gc(struct gc_args *args)
        int64 t0, t1, t2, t3, t4;
        uint64 heap0, heap1, obj;
        GCStats stats;
-       uint32 i;
 
        if(runtime·debug.allocfreetrace)
                runtime·tracegc();
@@ -1514,11 +1515,6 @@ gc(struct gc_args *args)
                        sweep.npausesweep++;
        }
 
-       // Shrink a stack if not much of it is being used.
-       // TODO: do in a parfor
-       for(i = 0; i < runtime·allglen; i++)
-               runtime·shrinkstack(runtime·allg[i]);
-
        runtime·MProf_GC();
        g->m->traceback = 0;
 }