Commit 568a449b authored by Brad Fitzpatrick's avatar Brad Fitzpatrick

io/ioutil: use sync.Pool in Discard

And merge the blackhole.go file back into ioutil,
where it once was. It was only in a separate file
because it used to have race-vs-!race versions.

R=golang-codereviews, rsc
CC=golang-codereviews
https://golang.org/cl/44060044
parent 1334b794
// 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.
package ioutil
var blackHoleBuf = make(chan []byte, 1)
func blackHole() []byte {
select {
case b := <-blackHoleBuf:
return b
default:
}
return make([]byte, 8192)
}
func blackHolePut(p []byte) {
select {
case blackHoleBuf <- p:
default:
}
}
...@@ -10,6 +10,7 @@ import ( ...@@ -10,6 +10,7 @@ import (
"io" "io"
"os" "os"
"sort" "sort"
"sync"
) )
// readAll reads from r until an error or EOF and returns the data it read // readAll reads from r until an error or EOF and returns the data it read
...@@ -136,14 +137,21 @@ func (devNull) WriteString(s string) (int, error) { ...@@ -136,14 +137,21 @@ func (devNull) WriteString(s string) (int, error) {
return len(s), nil return len(s), nil
} }
var blackHolePool = sync.Pool{
New: func() interface{} {
b := make([]byte, 8192)
return &b
},
}
func (devNull) ReadFrom(r io.Reader) (n int64, err error) { func (devNull) ReadFrom(r io.Reader) (n int64, err error) {
buf := blackHole() bufp := blackHolePool.Get().(*[]byte)
defer blackHolePut(buf)
readSize := 0 readSize := 0
for { for {
readSize, err = r.Read(buf) readSize, err = r.Read(*bufp)
n += int64(readSize) n += int64(readSize)
if err != nil { if err != nil {
blackHolePool.Put(bufp)
if err == io.EOF { if err == io.EOF {
return n, nil return n, nil
} }
......
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