Commit 5f853d7d authored by Russ Cox's avatar Russ Cox

runtime: fix finalizer test on amd64

Not scanning the stack by frames means we are reintroducing
a few false positives into the collection. Run the finalizer registration
in its own goroutine so that stack is guaranteed to be out of
consideration in a later collection.

This is working around a regression from yesterday's tip, but
it's not a regression from Go 1.1.

R=golang-dev
TBR=golang-dev
CC=golang-dev
https://golang.org/cl/14290043
parent 8d6bc666
...@@ -46,17 +46,18 @@ func TestFinalizerType(t *testing.T) { ...@@ -46,17 +46,18 @@ func TestFinalizerType(t *testing.T) {
} }
for _, tt := range finalizerTests { for _, tt := range finalizerTests {
func() { go func() {
v := new(int) v := new(int)
*v = 97531 *v = 97531
runtime.SetFinalizer(tt.convert(v), tt.finalizer) runtime.SetFinalizer(tt.convert(v), tt.finalizer)
v = nil v = nil
}() }()
time.Sleep(1 * time.Second)
runtime.GC() runtime.GC()
select { select {
case <-ch: case <-ch:
case <-time.After(time.Second * 4): case <-time.After(time.Second * 4):
t.Errorf("Finalizer of type %T didn't run", tt.finalizer) t.Errorf("finalizer for type %T didn't run", tt.finalizer)
} }
} }
} }
...@@ -72,25 +73,27 @@ func TestFinalizerInterfaceBig(t *testing.T) { ...@@ -72,25 +73,27 @@ func TestFinalizerInterfaceBig(t *testing.T) {
t.Skipf("Skipping on non-amd64 machine") t.Skipf("Skipping on non-amd64 machine")
} }
ch := make(chan bool) ch := make(chan bool)
func() { go func() {
v := &bigValue{0xDEADBEEFDEADBEEF, true, "It matters not how strait the gate"} v := &bigValue{0xDEADBEEFDEADBEEF, true, "It matters not how strait the gate"}
old := *v
runtime.SetFinalizer(v, func(v interface{}) { runtime.SetFinalizer(v, func(v interface{}) {
i, ok := v.(*bigValue) i, ok := v.(*bigValue)
if !ok { if !ok {
t.Errorf("Expected *bigValue from interface{} in finalizer, got %v", *i) t.Errorf("finalizer called with type %T, want *bigValue", v)
} }
if i.fill != 0xDEADBEEFDEADBEEF && i.it != true && i.up != "It matters not how strait the gate" { if *i != old {
t.Errorf("*bigValue from interface{} has the wrong value: %v\n", *i) t.Errorf("finalizer called with %+v, want %+v", *i, old)
} }
close(ch) close(ch)
}) })
v = nil v = nil
}() }()
time.Sleep(1 * time.Second)
runtime.GC() runtime.GC()
select { select {
case <-ch: case <-ch:
case <-time.After(time.Second * 4): case <-time.After(4 * time.Second):
t.Errorf("Finalizer set by SetFinalizer(*bigValue, func(interface{})) didn't run") t.Errorf("finalizer for type *bigValue didn't run")
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment