mirror of
https://github.com/golang/go
synced 2024-11-22 23:50:03 -07:00
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
This commit is contained in:
parent
8d6bc666fb
commit
5f853d7d94
@ -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")
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user