From 8076f21e8ea9cd3fc7d0fd23b2262fce662e4bde Mon Sep 17 00:00:00 2001 From: Dmitriy Vyukov Date: Mon, 7 Apr 2014 11:00:07 +0400 Subject: [PATCH] net: fix data race in benchmark If an error happens on a connection, server goroutine can call b.Logf after benchmark finishes. So join both client and server goroutines. Update #7718 LGTM=bradfitz R=golang-codereviews, bradfitz CC=golang-codereviews https://golang.org/cl/84750047 --- src/pkg/net/tcp_test.go | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/pkg/net/tcp_test.go b/src/pkg/net/tcp_test.go index c8c2a9c0d2..abd305aa4e 100644 --- a/src/pkg/net/tcp_test.go +++ b/src/pkg/net/tcp_test.go @@ -97,6 +97,7 @@ func benchmarkTCP(b *testing.B, persistent, timeout bool, laddr string) { b.Fatalf("Listen failed: %v", err) } defer ln.Close() + serverSem := make(chan bool, numConcurrent) // Acceptor. go func() { for { @@ -104,9 +105,13 @@ func benchmarkTCP(b *testing.B, persistent, timeout bool, laddr string) { if err != nil { break } + serverSem <- true // Server connection. go func(c Conn) { - defer c.Close() + defer func() { + c.Close() + <-serverSem + }() if timeout { c.SetDeadline(time.Now().Add(time.Hour)) // Not intended to fire. } @@ -119,13 +124,13 @@ func benchmarkTCP(b *testing.B, persistent, timeout bool, laddr string) { }(c) } }() - sem := make(chan bool, numConcurrent) + clientSem := make(chan bool, numConcurrent) for i := 0; i < conns; i++ { - sem <- true + clientSem <- true // Client connection. go func() { defer func() { - <-sem + <-clientSem }() c, err := Dial("tcp", ln.Addr().String()) if err != nil { @@ -144,8 +149,9 @@ func benchmarkTCP(b *testing.B, persistent, timeout bool, laddr string) { } }() } - for i := 0; i < cap(sem); i++ { - sem <- true + for i := 0; i < numConcurrent; i++ { + clientSem <- true + serverSem <- true } } -- 2.50.0