aboutsummaryrefslogtreecommitdiff
path: root/src/io
diff options
context:
space:
mode:
authorDamien Neil <dneil@google.com>2023-02-09 14:24:46 -0800
committerDamien Neil <dneil@google.com>2023-02-10 16:34:44 +0000
commitb02d5d325a4e93c88ecfc83a094c252148caa748 (patch)
treeacd16cfa1d3a7dac9dc014a02b15abc7ff054c40 /src/io
parent6e5c26084f9f3bc910181854a4ff20851188e222 (diff)
downloadgo-b02d5d325a4e93c88ecfc83a094c252148caa748.tar.gz
go-b02d5d325a4e93c88ecfc83a094c252148caa748.zip
Revert "io: allocate copy buffers from a pool"
This reverts CL 456555. Reason for revert: This seems too likely to exercise race conditions in code where a Write call continues to access its buffer after returning. The HTTP/2 ResponseWriter is one such example. Reverting this change while we think about this some more. For #57202 Change-Id: Ic86823f81d7da410ea6b3f17fb5b3f9a979e3340 Reviewed-on: https://go-review.googlesource.com/c/go/+/467095 Reviewed-by: Bryan Mills <bcmills@google.com> Run-TryBot: Damien Neil <dneil@google.com> TryBot-Result: Gopher Robot <gobot@golang.org>
Diffstat (limited to 'src/io')
-rw-r--r--src/io/io.go30
1 files changed, 18 insertions, 12 deletions
diff --git a/src/io/io.go b/src/io/io.go
index 374e20bf8c..630ab73b56 100644
--- a/src/io/io.go
+++ b/src/io/io.go
@@ -400,13 +400,6 @@ func CopyBuffer(dst Writer, src Reader, buf []byte) (written int64, err error) {
return copyBuffer(dst, src, buf)
}
-var bufPool = sync.Pool{
- New: func() any {
- b := make([]byte, 32*1024)
- return &b
- },
-}
-
// copyBuffer is the actual implementation of Copy and CopyBuffer.
// if buf is nil, one is allocated.
func copyBuffer(dst Writer, src Reader, buf []byte) (written int64, err error) {
@@ -420,9 +413,15 @@ func copyBuffer(dst Writer, src Reader, buf []byte) (written int64, err error) {
return rt.ReadFrom(src)
}
if buf == nil {
- bufp := bufPool.Get().(*[]byte)
- defer bufPool.Put(bufp)
- buf = *bufp
+ size := 32 * 1024
+ if l, ok := src.(*LimitedReader); ok && int64(size) > l.N {
+ if l.N < 1 {
+ size = 1
+ } else {
+ size = int(l.N)
+ }
+ }
+ buf = make([]byte, size)
}
for {
nr, er := src.Read(buf)
@@ -638,14 +637,21 @@ func (discard) WriteString(s string) (int, error) {
return len(s), nil
}
+var blackHolePool = sync.Pool{
+ New: func() any {
+ b := make([]byte, 8192)
+ return &b
+ },
+}
+
func (discard) ReadFrom(r Reader) (n int64, err error) {
- bufp := bufPool.Get().(*[]byte)
+ bufp := blackHolePool.Get().(*[]byte)
readSize := 0
for {
readSize, err = r.Read(*bufp)
n += int64(readSize)
if err != nil {
- bufPool.Put(bufp)
+ blackHolePool.Put(bufp)
if err == EOF {
return n, nil
}