Commit 42da2700 authored by Russ Cox's avatar Russ Cox

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/9368Reviewed-by: 's avatarAustin Clements <austin@google.com>
parent 33e0f3d8
...@@ -366,18 +366,22 @@ func BenchmarkPingPongHog(b *testing.B) { ...@@ -366,18 +366,22 @@ func BenchmarkPingPongHog(b *testing.B) {
pong <- <-ping pong <- <-ping
} }
close(stop) close(stop)
done <- true
}() }()
go func() { go func() {
for i := 0; i < b.N; i++ { for i := 0; i < b.N; i++ {
ping <- <-pong ping <- <-pong
} }
done <- true
}() }()
b.ResetTimer() b.ResetTimer()
ping <- true // Start ping-pong ping <- true // Start ping-pong
<-stop <-stop
b.StopTimer() b.StopTimer()
<-ping // Let last ponger exit <-ping // Let last ponger exit
<-done // Make sure hog exits <-done // Make sure goroutines exit
<-done
<-done
} }
func stackGrowthRecursive(i int) { func stackGrowthRecursive(i int) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment