From afb5fca25a6f59e9045317727f6899a58471d5f0 Mon Sep 17 00:00:00 2001 From: Cuong Manh Le Date: Sun, 13 Sep 2020 13:22:42 +0700 Subject: [PATCH] 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 TryBot-Result: Gobot Gobot Reviewed-by: Matthew Dempsky Trust: Cuong Manh Le --- test/fixedbugs/issue24491b.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/test/fixedbugs/issue24491b.go b/test/fixedbugs/issue24491b.go index 5f4a2f233e..142d798500 100644 --- a/test/fixedbugs/issue24491b.go +++ b/test/fixedbugs/issue24491b.go @@ -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 }