From 5f853d7d9407db1aaa7c7d0dfbf3dbd9d5c19093 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Wed, 2 Oct 2013 12:30:49 -0400 Subject: [PATCH] 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 --- src/pkg/runtime/mfinal_test.go | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/pkg/runtime/mfinal_test.go b/src/pkg/runtime/mfinal_test.go index ae06dd291a..6efef9bb03 100644 --- a/src/pkg/runtime/mfinal_test.go +++ b/src/pkg/runtime/mfinal_test.go @@ -46,17 +46,18 @@ func TestFinalizerType(t *testing.T) { } for _, tt := range finalizerTests { - func() { + go func() { v := new(int) *v = 97531 runtime.SetFinalizer(tt.convert(v), tt.finalizer) v = nil }() + time.Sleep(1 * time.Second) runtime.GC() select { case <-ch: 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) { t.Skipf("Skipping on non-amd64 machine") } ch := make(chan bool) - func() { + go func() { v := &bigValue{0xDEADBEEFDEADBEEF, true, "It matters not how strait the gate"} + old := *v runtime.SetFinalizer(v, func(v interface{}) { i, ok := v.(*bigValue) 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" { - t.Errorf("*bigValue from interface{} has the wrong value: %v\n", *i) + if *i != old { + t.Errorf("finalizer called with %+v, want %+v", *i, old) } close(ch) }) v = nil }() + time.Sleep(1 * time.Second) runtime.GC() select { case <-ch: - case <-time.After(time.Second * 4): - t.Errorf("Finalizer set by SetFinalizer(*bigValue, func(interface{})) didn't run") + case <-time.After(4 * time.Second): + t.Errorf("finalizer for type *bigValue didn't run") } } -- 2.50.0