pkg/pools: add buffer32KPool & use it for copy
Signed-off-by: Cristian Staretu <cristian.staretu@gmail.com>
(cherry picked from commit ba40f4593f79a653f1e3a8b9597b7900fb68a564)
Signed-off-by: Andrew Hsu <andrewhsu@docker.com>
diff --git a/pkg/pools/pools.go b/pkg/pools/pools.go
index 5c5aead..6a111a3 100644
--- a/pkg/pools/pools.go
+++ b/pkg/pools/pools.go
@@ -17,15 +17,16 @@
"github.com/docker/docker/pkg/ioutils"
)
+const buffer32K = 32 * 1024
+
var (
// BufioReader32KPool is a pool which returns bufio.Reader with a 32K buffer.
BufioReader32KPool = newBufioReaderPoolWithSize(buffer32K)
// BufioWriter32KPool is a pool which returns bufio.Writer with a 32K buffer.
BufioWriter32KPool = newBufioWriterPoolWithSize(buffer32K)
+ buffer32KPool = newBufferPoolWithSize(buffer32K)
)
-const buffer32K = 32 * 1024
-
// BufioReaderPool is a bufio reader that uses sync.Pool.
type BufioReaderPool struct {
pool sync.Pool
@@ -54,11 +55,31 @@
bufPool.pool.Put(b)
}
+type bufferPool struct {
+ pool sync.Pool
+}
+
+func newBufferPoolWithSize(size int) *bufferPool {
+ return &bufferPool{
+ pool: sync.Pool{
+ New: func() interface{} { return make([]byte, size) },
+ },
+ }
+}
+
+func (bp *bufferPool) Get() []byte {
+ return bp.pool.Get().([]byte)
+}
+
+func (bp *bufferPool) Put(b []byte) {
+ bp.pool.Put(b)
+}
+
// Copy is a convenience wrapper which uses a buffer to avoid allocation in io.Copy.
func Copy(dst io.Writer, src io.Reader) (written int64, err error) {
- buf := BufioReader32KPool.Get(src)
- written, err = io.Copy(dst, buf)
- BufioReader32KPool.Put(buf)
+ buf := buffer32KPool.Get()
+ written, err = io.CopyBuffer(dst, src, buf)
+ buffer32KPool.Put(buf)
return
}
diff --git a/pkg/pools/pools_test.go b/pkg/pools/pools_test.go
index 1661b78..d71cb99 100644
--- a/pkg/pools/pools_test.go
+++ b/pkg/pools/pools_test.go
@@ -159,3 +159,8 @@
t.Fatalf("The ReaderCloser should have been closed, it is not.")
}
}
+
+func TestBufferPoolPutAndGet(t *testing.T) {
+ buf := buffer32KPool.Get()
+ buffer32KPool.Put(buf)
+}