1
0
mirror of https://github.com/golang/go synced 2024-11-26 03:07:57 -07:00

runtime: fix tiny memory leak

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
This commit is contained in:
Russ Cox 2012-02-19 00:26:33 -05:00
parent efacb2a1b4
commit 89b075cc90

View File

@ -1011,6 +1011,7 @@ runtime·oldstack(void)
{ {
Stktop *top, old; Stktop *top, old;
uint32 argsize; uint32 argsize;
uintptr cret;
byte *sp; byte *sp;
G *g1; G *g1;
int32 goid; int32 goid;
@ -1034,7 +1035,9 @@ runtime·oldstack(void)
g1->stackbase = old.stackbase; g1->stackbase = old.stackbase;
g1->stackguard = old.stackguard; 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 // Called from reflect·call or from runtime·morestack when a new