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 (
|
||||
"runtime"
|
||||
"sync/atomic"
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
var done uint32
|
||||
var done = make(chan bool)
|
||||
|
||||
func setup() unsafe.Pointer {
|
||||
s := "ok"
|
||||
runtime.SetFinalizer(&s, func(p *string) { atomic.StoreUint32(&done, 1) })
|
||||
runtime.SetFinalizer(&s, func(p *string) { close(done) })
|
||||
return unsafe.Pointer(&s)
|
||||
}
|
||||
|
||||
@ -27,17 +26,18 @@ func setup() unsafe.Pointer {
|
||||
//go:uintptrescapes
|
||||
func before(p uintptr) int {
|
||||
runtime.GC()
|
||||
if atomic.LoadUint32(&done) != 0 {
|
||||
select {
|
||||
case <-done:
|
||||
panic("GC early")
|
||||
default:
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func after() int {
|
||||
runtime.GC()
|
||||
if atomic.LoadUint32(&done) == 0 {
|
||||
panic("GC late")
|
||||
}
|
||||
runtime.GC()
|
||||
<-done
|
||||
return 0
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user