From: Russ Cox Date: Mon, 27 Apr 2015 20:08:11 +0000 (-0400) Subject: runtime: fix race in BenchmarkPingPongHog X-Git-Tag: go1.5beta1~890 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=42da27002428ed27f9aeee5800120e2222c226a0;p=gostls13.git 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 --- diff --git a/src/runtime/proc_test.go b/src/runtime/proc_test.go index fccf397062..4c5712d32f 100644 --- a/src/runtime/proc_test.go +++ b/src/runtime/proc_test.go @@ -366,18 +366,22 @@ func BenchmarkPingPongHog(b *testing.B) { 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) {