From: Dmitriy Vyukov Date: Fri, 8 Aug 2014 08:48:34 +0000 (+0400) Subject: encoding/gob: fix data races in benchmarks X-Git-Tag: go1.4beta1~870 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=f7832df7695c1e5930b2c8ed5e02d529d00f21a4;p=gostls13.git encoding/gob: fix data races in benchmarks All goroutines decode into the same value. LGTM=r R=r, abursavich CC=golang-codereviews https://golang.org/cl/123930043 --- diff --git a/src/pkg/encoding/gob/timing_test.go b/src/pkg/encoding/gob/timing_test.go index 29c9b858b6..ec55c4d63d 100644 --- a/src/pkg/encoding/gob/timing_test.go +++ b/src/pkg/encoding/gob/timing_test.go @@ -19,12 +19,13 @@ type Bench struct { D []byte } -func benchmarkEndToEnd(b *testing.B, v interface{}, pipe func() (r io.Reader, w io.Writer, err error)) { +func benchmarkEndToEnd(b *testing.B, ctor func() interface{}, pipe func() (r io.Reader, w io.Writer, err error)) { b.RunParallel(func(pb *testing.PB) { r, w, err := pipe() if err != nil { b.Fatal("can't get pipe:", err) } + v := ctor() enc := NewEncoder(w) dec := NewDecoder(r) for pb.Next() { @@ -39,29 +40,33 @@ func benchmarkEndToEnd(b *testing.B, v interface{}, pipe func() (r io.Reader, w } func BenchmarkEndToEndPipe(b *testing.B) { - v := &Bench{7, 3.2, "now is the time", bytes.Repeat([]byte("for all good men"), 100)} - benchmarkEndToEnd(b, v, func() (r io.Reader, w io.Writer, err error) { + benchmarkEndToEnd(b, func() interface{} { + return &Bench{7, 3.2, "now is the time", bytes.Repeat([]byte("for all good men"), 100)} + }, func() (r io.Reader, w io.Writer, err error) { r, w, err = os.Pipe() return }) } func BenchmarkEndToEndByteBuffer(b *testing.B) { - v := &Bench{7, 3.2, "now is the time", bytes.Repeat([]byte("for all good men"), 100)} - benchmarkEndToEnd(b, v, func() (r io.Reader, w io.Writer, err error) { + benchmarkEndToEnd(b, func() interface{} { + return &Bench{7, 3.2, "now is the time", bytes.Repeat([]byte("for all good men"), 100)} + }, func() (r io.Reader, w io.Writer, err error) { var buf bytes.Buffer return &buf, &buf, nil }) } func BenchmarkEndToEndSliceByteBuffer(b *testing.B) { - v := &Bench{7, 3.2, "now is the time", nil} - Register(v) - arr := make([]interface{}, 100) - for i := range arr { - arr[i] = v - } - benchmarkEndToEnd(b, &arr, func() (r io.Reader, w io.Writer, err error) { + benchmarkEndToEnd(b, func() interface{} { + v := &Bench{7, 3.2, "now is the time", nil} + Register(v) + arr := make([]interface{}, 100) + for i := range arr { + arr[i] = v + } + return &arr + }, func() (r io.Reader, w io.Writer, err error) { var buf bytes.Buffer return &buf, &buf, nil })