1
0
mirror of https://github.com/golang/go synced 2024-11-24 04:40:24 -07:00
go/test
Russ Cox b3932baba4 runtime: fix sudog leak
The SudoG used to sit on the stack, so it was cheap to allocated
and didn't need to be cleaned up when finished.

For the conversion to Go, we had to move sudog off the stack
for a few reasons, so we added a cache of recently used sudogs
to keep allocation cheap. But we didn't add any of the necessary
cleanup before adding a SudoG to the new cache, and so the cached
SudoGs had stale pointers inside them that have caused all sorts
of awful, hard to debug problems.

CL 155760043 made sure SudoG.elem is cleaned up.
CL 150520043 made sure SudoG.selectdone is cleaned up.

This CL makes sure SudoG.next, SudoG.prev, and SudoG.waitlink
are cleaned up. I should have done this when I did the other two
fields; instead I wasted a week tracking down a leak they caused.

A dangling SudoG.waitlink can point into a sudogcache list that
has been "forgotten" in order to let the GC collect it, but that
dangling .waitlink keeps the list from being collected.
And then the list holding the SudoG with the dangling waitlink
can find itself in the same situation, and so on. We end up
with lists of lists of unusable SudoGs that are still linked into
the object graph and never collected (given the right mix of
non-trivial selects and non-channel synchronization).

More details in golang.org/issue/9110.

Fixes #9110.

LGTM=r
R=r
CC=dvyukov, golang-codereviews, iant, khr
https://golang.org/cl/177870043
2014-11-16 16:44:45 -05:00
..
bench build: adjustments for move from src/pkg to src 2014-09-08 00:06:45 -04:00
bugs
chan cmd/gc: implement 'for range x {' 2014-07-16 19:27:10 -04:00
ddd2.dir
dwarf
fixedbugs runtime: fix sudog leak 2014-11-16 16:44:45 -05:00
import2.dir
import4.dir test: match gccgo import error messages 2013-12-12 19:02:11 -08:00
interface cmd/gc: blank methods are not permitted in interface types 2014-10-15 09:55:13 -07:00
ken
method4.dir cmd/gc: do not omit wrapper for expression (interface{...}).F 2014-01-07 13:26:48 +01:00
safe
stress build: adjustments for move from src/pkg to src 2014-09-08 00:06:45 -04:00
syntax test: match gccgo error messages 2013-12-12 17:18:12 -08:00
64bit.go
235.go
alias1.go
alias.go
append.go
args.go
assign1.go
assign.go cmd/gc: prohibit short variable declarations containing duplicate symbols 2014-10-06 17:16:39 -04:00
bigalg.go
bigmap.go
blank1.go test: match gccgo error messages for blank1.go 2013-09-28 15:19:05 -07:00
blank.go test: revert changes made for Go SSA interpreter test. 2013-10-08 14:36:20 -04:00
bom.go
bombad.go
bounds.go
chancap.go
char_lit1.go
char_lit.go
closedchan.go
closure.go
cmp6.go cmd/gc: do not consider length zero arrays as comparable. 2014-01-31 00:30:56 +01:00
cmp.go cmd/gc: do not nop-convert equivalent but different interface types. 2014-02-27 08:07:50 +01:00
cmplx.go
cmplxdivide1.go
cmplxdivide.c
cmplxdivide.go
complit1.go
complit.go
compos.go
const1.go test: match gccgo error messages 2013-12-12 17:18:12 -08:00
const2.go
const3.go
const4.go
const5.go cmd/gc: reject builtin function calls in len(fixed array) constants 2014-04-03 19:04:33 -04:00
const6.go
const.go
convert1.go
convert3.go
convert.go
convlit1.go
convlit.go
convT2X.go
copy.go
crlf.go
ddd1.go
ddd2.go
ddd.go
decl.go
declbad.go
defer.go
deferfin.go runtime: combine small NoScan allocations 2014-01-24 22:35:11 +04:00
deferprint.go
deferprint.out
divide.go
divmod.go all: fix a few spelling errors in source comments 2013-12-27 08:59:02 -08:00
empty.go
env.go
eof1.go
eof.go
errchk
escape2.go cmd/gc: run escape analysis always (even in -N mode) 2014-09-24 15:20:03 -04:00
escape2n.go cmd/gc: run escape analysis always (even in -N mode) 2014-09-24 15:20:03 -04:00
escape3.go
escape4.go
escape5.go cmd/gc: distinguish unnamed vs blank-named return variables better 2014-02-13 20:59:39 -05:00
escape.go
float_lit2.go test: fix two typos in float_lit2.go 2014-05-21 17:19:12 -04:00
float_lit3.go test/float_lit2.go: rewrite to test values near boundaries 2014-05-21 17:12:06 -04:00
float_lit.go
floatcmp.go
for.go
func1.go
func2.go
func3.go
func4.go
func5.go
func6.go
func7.go
func8.go
func.go
funcdup2.go test: match gccgo error messages 2013-12-12 17:18:12 -08:00
funcdup.go test: match gccgo error messages 2013-12-12 17:18:12 -08:00
gc1.go
gc2.go build: make nacl pass 2014-05-20 12:10:19 -04:00
gc.go
gcstring.go runtime: fix empty string handling in garbage collector 2014-03-11 23:58:39 -04:00
golden.out
goprint.go
goprint.out
goto.go
helloworld.go
helloworld.out
if.go
import1.go test: match gccgo import error messages 2013-12-12 19:02:11 -08:00
import2.go
import4.go
import5.go
import.go
index0.go
index1.go
index2.go
index.go test: recognize gccgo error message in index.go 2013-09-27 20:38:52 -07:00
indirect1.go
indirect.go
init1.go
init.go
initcomma.go
initialize.go
initializerr.go
int_lit.go
intcvt.go
iota.go
label1.go
label.go
linkx_run.go test: fix nacl build 2014-11-09 21:10:49 -05:00
linkx.go test: move linkx and sinit to run.go 2014-11-06 15:14:08 -05:00
literal.go
live1.go cmd/gc: correct liveness for fat variables 2014-02-15 10:58:55 -05:00
live2.go cmd/gc: fix call order in array literal of slice literal of make chan 2014-09-30 12:48:47 -04:00
live.go cmd/gc: fix call order in array literal of slice literal of make chan 2014-09-30 12:48:47 -04:00
mallocfin.go
map1.go
map.go test/mapnan.go: add regression test for non-empty interfaces. 2014-08-06 17:02:55 -04:00
maplinear.go test: make maplinear more robust 2014-10-27 18:59:02 -04:00
method1.go
method2.go
method3.go
method4.go
method5.go
method.go
named1.go cmd/gc: comma-ok assignments produce untyped bool as 2nd result 2014-08-11 16:11:55 -07:00
named.go
nil.go
nilcheck.go
nilptr2.go test: revert changes made for Go SSA interpreter test. 2013-10-08 14:36:20 -04:00
nilptr3.go cmd/gc: correct handling of globals, func args, results 2014-05-15 15:34:53 -04:00
nilptr4.go cmd/gc: fix bad checknil with ints on 32 bit compilers 2014-02-26 12:25:13 -08:00
nilptr.go
nosplit.go liblink: make GO_ARGS the default for functions beginning with · 2014-09-16 17:39:55 -04:00
nul1.go
parentype.go
peano.go
print.go runtime: move built-in print routines to go. 2014-07-31 13:48:48 -07:00
print.out runtime: move built-in print routines to go. 2014-07-31 13:48:48 -07:00
printbig.go
printbig.out
range.go cmd/gc: implement 'for range x {' 2014-07-16 19:27:10 -04:00
recover1.go
recover2.go
recover3.go
recover.go test: add more cases to recover.go 2014-10-22 08:06:15 -07:00
rename1.go
rename.go
reorder2.go cmd/gc: shorten temporary lifetimes when possible 2014-04-01 13:31:38 -04:00
reorder.go
return.go
rotate0.go
rotate1.go
rotate2.go
rotate3.go
rotate.go
run test/run: add /usr/pkg/bin to PATH. 2014-03-03 02:16:15 -05:00
run.go test: move linkx and sinit to run.go 2014-11-06 15:14:08 -05:00
rune.go
runtime.go
shift1.go test: avoid "declared but not used" errors in shift1.go 2014-07-20 12:25:24 -07:00
shift2.go
sieve.go
sigchld.go test: skip SIGCHLD test on Plan 9 2014-01-29 09:28:23 +01:00
sigchld.out
simassign.go
sinit_run.go test: fix nacl build 2014-11-09 21:10:49 -05:00
sinit.go test: move linkx and sinit to run.go 2014-11-06 15:14:08 -05:00
sizeof.go
slice3.go cmd/gc, runtime: treat slices and strings like pointers in garbage collection 2014-08-25 14:38:19 -04:00
slice3err.go test: match gccgo error messages 2013-12-12 17:18:12 -08:00
slicecap.go cmd/gc, runtime: treat slices and strings like pointers in garbage collection 2014-08-25 14:38:19 -04:00
solitaire.go
stack.go
string_lit.go test: add []rune case to string_lit.go 2013-12-12 17:17:02 -08:00
stringrange.go
struct0.go
switch3.go
switch4.go
switch.go
testlib
tinyfin.go runtime: combine small NoScan allocations 2014-01-24 22:35:11 +04:00
torture.go cmd/8g: don't allocate a register early for cap(CHAN). 2014-07-01 09:20:51 +02:00
turing.go
typecheck.go cmd/gc: silence assignment errors to undefined symbols 2014-01-03 21:03:20 +01:00
typeswitch1.go
typeswitch2.go
typeswitch3.go
typeswitch.go
undef.go
utf.go
varerr.go
varinit.go
zerodivide.go