Commit eb43ce2d authored by Brad Fitzpatrick's avatar Brad Fitzpatrick

io/ioutil: fix Discard data race

Fixes #4589

R=golang-dev, iant, dvyukov
CC=golang-dev
https://golang.org/cl/7011047
parent 91484c6c
...@@ -2,12 +2,22 @@ ...@@ -2,12 +2,22 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// +build !race
package ioutil package ioutil
var blackHoleBuf = make([]byte, 8192) var blackHoleBuf = make(chan []byte, 1)
func blackHole() []byte { func blackHole() []byte {
return blackHoleBuf select {
case b := <-blackHoleBuf:
return b
default:
}
return make([]byte, 8192)
}
func blackHolePut(p []byte) {
select {
case blackHoleBuf <- p:
default:
}
} }
// Copyright 2012 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// +build race
package ioutil
// Replaces the normal fast implementation with slower but formally correct one.
func blackHole() []byte {
return make([]byte, 8192)
}
...@@ -132,6 +132,7 @@ func (devNull) Write(p []byte) (int, error) { ...@@ -132,6 +132,7 @@ func (devNull) Write(p []byte) (int, error) {
func (devNull) ReadFrom(r io.Reader) (n int64, err error) { func (devNull) ReadFrom(r io.Reader) (n int64, err error) {
buf := blackHole() buf := blackHole()
defer blackHolePut(buf)
readSize := 0 readSize := 0
for { for {
readSize, err = r.Read(buf) readSize, err = r.Read(buf)
......
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