1
0
mirror of https://github.com/golang/go synced 2024-11-06 01:46:12 -07:00
go/test/fixedbugs/issue5493.go
Matthew Dempsky fb69c67cad [dev.regabi] test: enable finalizer tests on !amd64
The gc implementation has had precise GC for a while now, so we can
enable these tests more broadly.

Confirmed that they still fail with gccgo 10.2.1.

Change-Id: Ic1c0394ab832024a99e34163c422941a3706e1a2
Reviewed-on: https://go-review.googlesource.com/c/go/+/281542
Trust: Matthew Dempsky <mdempsky@google.com>
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
2021-01-05 21:11:31 +00:00

59 lines
953 B
Go

// run
// Copyright 2013 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package main
import (
"runtime"
"sync"
"sync/atomic"
"time"
)
const N = 10
var count int64
func run() error {
f1 := func() {}
f2 := func() {
func() {
f1()
}()
}
runtime.SetFinalizer(&f1, func(f *func()) {
atomic.AddInt64(&count, -1)
})
go f2()
return nil
}
func main() {
// Does not work with gccgo, due to partially conservative GC.
// Try to enable when we have fully precise GC.
if runtime.Compiler == "gccgo" {
return
}
count = N
var wg sync.WaitGroup
wg.Add(N)
for i := 0; i < N; i++ {
go func() {
run()
wg.Done()
}()
}
wg.Wait()
for i := 0; i < 2*N; i++ {
time.Sleep(10 * time.Millisecond)
runtime.GC()
}
if count != 0 {
println(count, "out of", N, "finalizer are not called")
panic("not all finalizers are called")
}
}