1
0
mirror of https://github.com/golang/go synced 2024-11-18 15:54:42 -07:00

sync: deflake TestWaitGroupMisuse2

Also runs 100X faster on average, because it takes so many
fewer attempts to trigger the failure.

Fixes #11443.

Change-Id: I8c39ee48bb3ff6c36fa63083e04076771b65a80d
Reviewed-on: https://go-review.googlesource.com/36841
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Dmitry Vyukov <dvyukov@google.com>
This commit is contained in:
Russ Cox 2017-02-13 10:17:52 -05:00
parent 863035efce
commit 83f95b85de

View File

@ -70,11 +70,8 @@ func TestWaitGroupMisuse(t *testing.T) {
func TestWaitGroupMisuse2(t *testing.T) {
knownRacy(t)
if testing.Short() {
t.Skip("skipping flaky test in short mode; see issue 11443")
}
if runtime.NumCPU() <= 2 {
t.Skip("NumCPU<=2, skipping: this test requires parallelism")
if runtime.NumCPU() <= 4 {
t.Skip("NumCPU<=4, skipping: this test requires parallelism")
}
defer func() {
err := recover()
@ -86,24 +83,37 @@ func TestWaitGroupMisuse2(t *testing.T) {
}()
defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(4))
done := make(chan interface{}, 2)
// The detection is opportunistically, so we want it to panic
// The detection is opportunistic, so we want it to panic
// at least in one run out of a million.
for i := 0; i < 1e6; i++ {
var wg WaitGroup
var here uint32
wg.Add(1)
go func() {
defer func() {
done <- recover()
}()
atomic.AddUint32(&here, 1)
for atomic.LoadUint32(&here) != 3 {
// spin
}
wg.Wait()
}()
go func() {
defer func() {
done <- recover()
}()
atomic.AddUint32(&here, 1)
for atomic.LoadUint32(&here) != 3 {
// spin
}
wg.Add(1) // This is the bad guy.
wg.Done()
}()
atomic.AddUint32(&here, 1)
for atomic.LoadUint32(&here) != 3 {
// spin
}
wg.Done()
for j := 0; j < 2; j++ {
if err := <-done; err != nil {