]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: fix tiny memory leak
authorRuss Cox <rsc@golang.org>
Sun, 19 Feb 2012 05:26:33 +0000 (00:26 -0500)
committerRuss Cox <rsc@golang.org>
Sun, 19 Feb 2012 05:26:33 +0000 (00:26 -0500)
The m->cret word holds the C return value when returning
across a stack split boundary.  It was not being cleared after
use, which means that the return value (if a C function)
or else the value of AX/R0 at the time of the last stack unsplit
was being kept alive longer than necessary.  Clear it.

I think the effect here should be very small, but worth fixing
anyway.

R=golang-dev, bradfitz
CC=golang-dev
https://golang.org/cl/5677092

src/pkg/runtime/proc.c

index d9047c92c15429118434e87a406b1c8bb787a788..eaec093c857fe82ab78cf7381d723a1f21e95463 100644 (file)
@@ -1011,6 +1011,7 @@ runtime·oldstack(void)
 {
        Stktop *top, old;
        uint32 argsize;
+       uintptr cret;
        byte *sp;
        G *g1;
        int32 goid;
@@ -1034,7 +1035,9 @@ runtime·oldstack(void)
        g1->stackbase = old.stackbase;
        g1->stackguard = old.stackguard;
 
-       runtime·gogo(&old.gobuf, m->cret);
+       cret = m->cret;
+       m->cret = 0;  // drop reference
+       runtime·gogo(&old.gobuf, cret);
 }
 
 // Called from reflect·call or from runtime·morestack when a new