]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: eliminate false retention due to m->moreargp/morebuf
authorDmitriy Vyukov <dvyukov@google.com>
Wed, 26 Mar 2014 15:06:15 +0000 (19:06 +0400)
committerDmitriy Vyukov <dvyukov@google.com>
Wed, 26 Mar 2014 15:06:15 +0000 (19:06 +0400)
m->moreargp/morebuf were not cleared in case of preemption and stack growing,
it can lead to persistent leaks of large memory blocks.

It seems to fix the sync.Pool finalizer failures. I've run the test 500'000 times
w/o a single failure; previously it would fail dozens of times.

Fixes #7633.
Fixes #7533.

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

src/pkg/runtime/stack.c

index 6e5d9f1f5877e8225768883ac7c925941b56be4b..4d21c719b0222df8a3106442a9e14e30e5d7ff6e 100644 (file)
@@ -608,7 +608,8 @@ runtime·newstack(void)
        uintptr sp;
        uintptr *src, *dst, *dstend;
        G *gp;
-       Gobuf label;
+       Gobuf label, morebuf;
+       void *moreargp;
        bool newstackcall;
 
        if(m->forkstackguard)
@@ -627,6 +628,12 @@ runtime·newstack(void)
 
        framesize = m->moreframesize;
        argsize = m->moreargsize;
+       moreargp = m->moreargp;
+       m->moreargp = nil;
+       morebuf = m->morebuf;
+       m->morebuf.pc = (uintptr)nil;
+       m->morebuf.lr = (uintptr)nil;
+       m->morebuf.sp = (uintptr)nil;
        gp->status = Gwaiting;
        gp->waitreason = "stack split";
        newstackcall = framesize==1;
@@ -727,13 +734,9 @@ runtime·newstack(void)
 
        top->stackbase = gp->stackbase;
        top->stackguard = gp->stackguard;
-       top->gobuf = m->morebuf;
-       top->argp = m->moreargp;
+       top->gobuf = morebuf;
+       top->argp = moreargp;
        top->argsize = argsize;
-       m->moreargp = nil;
-       m->morebuf.pc = (uintptr)nil;
-       m->morebuf.lr = (uintptr)nil;
-       m->morebuf.sp = (uintptr)nil;
 
        // copy flag from panic
        top->panic = gp->ispanic;