mirror of
https://github.com/weaveworks/scope.git
synced 2026-03-03 10:11:03 +00:00
47 lines
840 B
Go
47 lines
840 B
Go
package xfer
|
|
|
|
import (
|
|
"bytes"
|
|
"sync"
|
|
"sync/atomic"
|
|
)
|
|
|
|
// A Buffer is a reference counted bytes.Buffer, which belongs
|
|
// to a sync.Pool
|
|
type Buffer struct {
|
|
bytes.Buffer
|
|
pool *sync.Pool
|
|
refs int32
|
|
}
|
|
|
|
// NewBuffer creates a new buffer
|
|
func NewBuffer(pool *sync.Pool) *Buffer {
|
|
return &Buffer{
|
|
pool: pool,
|
|
refs: 0,
|
|
}
|
|
}
|
|
|
|
// Get increases the reference count. It is safe for concurrent calls.
|
|
func (b *Buffer) Get() {
|
|
atomic.AddInt32(&b.refs, 1)
|
|
}
|
|
|
|
// Put decreases the reference count, and when it hits zero, puts the
|
|
// buffer back in the pool.
|
|
func (b *Buffer) Put() {
|
|
if atomic.AddInt32(&b.refs, -1) == 0 {
|
|
b.Reset()
|
|
b.pool.Put(b)
|
|
}
|
|
}
|
|
|
|
// NewBufferPool creates a new buffer pool.
|
|
func NewBufferPool() *sync.Pool {
|
|
result := &sync.Pool{}
|
|
result.New = func() interface{} {
|
|
return NewBuffer(result)
|
|
}
|
|
return result
|
|
}
|