summaryrefslogtreecommitdiff
path: root/vendor/github.com/oxtoacart/bpool/bufferpool.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/oxtoacart/bpool/bufferpool.go')
-rw-r--r--vendor/github.com/oxtoacart/bpool/bufferpool.go40
1 files changed, 40 insertions, 0 deletions
diff --git a/vendor/github.com/oxtoacart/bpool/bufferpool.go b/vendor/github.com/oxtoacart/bpool/bufferpool.go
new file mode 100644
index 0000000..8c8ac64
--- /dev/null
+++ b/vendor/github.com/oxtoacart/bpool/bufferpool.go
@@ -0,0 +1,40 @@
+package bpool
+
+import (
+ "bytes"
+)
+
+// BufferPool implements a pool of bytes.Buffers in the form of a bounded
+// channel.
+type BufferPool struct {
+ c chan *bytes.Buffer
+}
+
+// NewBufferPool creates a new BufferPool bounded to the given size.
+func NewBufferPool(size int) (bp *BufferPool) {
+ return &BufferPool{
+ c: make(chan *bytes.Buffer, size),
+ }
+}
+
+// Get gets a Buffer from the BufferPool, or creates a new one if none are
+// available in the pool.
+func (bp *BufferPool) Get() (b *bytes.Buffer) {
+ select {
+ case b = <-bp.c:
+ // reuse existing buffer
+ default:
+ // create new buffer
+ b = bytes.NewBuffer([]byte{})
+ }
+ return
+}
+
+// Put returns the given Buffer to the BufferPool.
+func (bp *BufferPool) Put(b *bytes.Buffer) {
+ b.Reset()
+ select {
+ case bp.c <- b:
+ default: // Discard the buffer if the pool is full.
+ }
+}