runtime: fix race in BenchmarkPingPongHog
The master goroutine was returning before
the child goroutine had done its final i < b.N
(the one that fails and causes it to exit the loop)
and then the benchmark harness was updating
b.N, causing a read+write race on b.N.
Change-Id: I2504270a0de30544736f6c32161337a25b505c3e
Reviewed-on: https://go-review.googlesource.com/9368
Reviewed-by: Austin Clements <austin@google.com>
diff --git a/src/runtime/proc_test.go b/src/runtime/proc_test.go
index fccf397..4c5712d 100644
--- a/src/runtime/proc_test.go
+++ b/src/runtime/proc_test.go
@@ -366,18 +366,22 @@
pong <- <-ping
}
close(stop)
+ done <- true
}()
go func() {
for i := 0; i < b.N; i++ {
ping <- <-pong
}
+ done <- true
}()
b.ResetTimer()
ping <- true // Start ping-pong
<-stop
b.StopTimer()
<-ping // Let last ponger exit
- <-done // Make sure hog exits
+ <-done // Make sure goroutines exit
+ <-done
+ <-done
}
func stackGrowthRecursive(i int) {