From 42da27002428ed27f9aeee5800120e2222c226a0 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Mon, 27 Apr 2015 16:08:11 -0400 Subject: [PATCH] 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 --- src/runtime/proc_test.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/runtime/proc_test.go b/src/runtime/proc_test.go index fccf3970621..4c5712d32f6 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) {