mirror of
https://github.com/golang/go.git
synced 2025-05-05 15:43:04 +00:00
test: fix flaky test for issue24491
runtime.GC() doesn't guarantee the finalizer has run, so use a channel instead to make sure finalizer was run in call to "after()". Fixes #41361 Change-Id: I69c801e29aea49757ea72c52e8db13239de19ddc Reviewed-on: https://go-review.googlesource.com/c/go/+/254401 Run-TryBot: Cuong Manh Le <cuong.manhle.vn@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Matthew Dempsky <mdempsky@google.com> Trust: Cuong Manh Le <cuong.manhle.vn@gmail.com>
This commit is contained in:
parent
5f1b12bfbe
commit
afb5fca25a
@ -11,15 +11,14 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"runtime"
|
"runtime"
|
||||||
"sync/atomic"
|
|
||||||
"unsafe"
|
"unsafe"
|
||||||
)
|
)
|
||||||
|
|
||||||
var done uint32
|
var done = make(chan bool)
|
||||||
|
|
||||||
func setup() unsafe.Pointer {
|
func setup() unsafe.Pointer {
|
||||||
s := "ok"
|
s := "ok"
|
||||||
runtime.SetFinalizer(&s, func(p *string) { atomic.StoreUint32(&done, 1) })
|
runtime.SetFinalizer(&s, func(p *string) { close(done) })
|
||||||
return unsafe.Pointer(&s)
|
return unsafe.Pointer(&s)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -27,17 +26,18 @@ func setup() unsafe.Pointer {
|
|||||||
//go:uintptrescapes
|
//go:uintptrescapes
|
||||||
func before(p uintptr) int {
|
func before(p uintptr) int {
|
||||||
runtime.GC()
|
runtime.GC()
|
||||||
if atomic.LoadUint32(&done) != 0 {
|
select {
|
||||||
|
case <-done:
|
||||||
panic("GC early")
|
panic("GC early")
|
||||||
|
default:
|
||||||
}
|
}
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
func after() int {
|
func after() int {
|
||||||
runtime.GC()
|
runtime.GC()
|
||||||
if atomic.LoadUint32(&done) == 0 {
|
runtime.GC()
|
||||||
panic("GC late")
|
<-done
|
||||||
}
|
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user