diff --git a/common/alloc/buffer.go b/common/alloc/buffer.go index e9109ee8..ecdb53a5 100644 --- a/common/alloc/buffer.go +++ b/common/alloc/buffer.go @@ -21,9 +21,18 @@ type Buffer struct { offset int } +func CreateBuffer(container []byte, parent *BufferPool) *Buffer { + b := new(Buffer) + b.head = container + b.pool = parent + b.Value = b.head[defaultOffset:] + b.offset = defaultOffset + return b +} + // Release recycles the buffer into an internal buffer pool. func (b *Buffer) Release() { - if b == nil { + if b == nil || b.head == nil { return } b.pool.Free(b) @@ -122,7 +131,7 @@ func (b *Buffer) SliceFrom(from int) *Buffer { func (b *Buffer) SliceBack(offset int) *Buffer { newoffset := b.offset - offset if newoffset < 0 { - newoffset = 0 + panic("Negative buffer offset.") } b.Value = b.head[newoffset : b.offset+len(b.Value)] b.offset = newoffset diff --git a/common/alloc/buffer_pool.go b/common/alloc/buffer_pool.go index 1276ecaf..f6b68589 100644 --- a/common/alloc/buffer_pool.go +++ b/common/alloc/buffer_pool.go @@ -29,12 +29,7 @@ func (p *BufferPool) Allocate() *Buffer { default: b = p.allocator.Get().([]byte) } - return &Buffer{ - head: b, - pool: p, - Value: b[defaultOffset:], - offset: defaultOffset, - } + return CreateBuffer(b, p) } func (p *BufferPool) Free(buffer *Buffer) {