Skip to content

Commit

Permalink
Add bytespools ownership for buf.Buffer
Browse files Browse the repository at this point in the history
  • Loading branch information
Vigilans authored and xiaokangwang committed Feb 19, 2023
1 parent 8b3215c commit 44be94a
Showing 1 changed file with 34 additions and 4 deletions.
38 changes: 34 additions & 4 deletions common/buf/buffer.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,23 @@ const (

var pool = bytespool.GetPool(Size)

// ownership represents the data owner of the buffer.
type ownership uint8

const (
managed ownership = 0
unmanaged ownership = 1
bytespools ownership = 2
)

// Buffer is a recyclable allocation of a byte array. Buffer.Release() recycles
// the buffer into an internal buffer pool, in order to recreate a buffer more
// quickly.
type Buffer struct {
v []byte
start int32
end int32
unmanaged bool
ownership ownership
}

// New creates a Buffer with 0 length and 2K capacity.
Expand All @@ -30,12 +39,20 @@ func New() *Buffer {
}
}

// NewWithSize creates a Buffer with 0 length and capacity with at least the given size.
func NewWithSize(size int32) *Buffer {
return &Buffer{
v: bytespool.Alloc(size),
ownership: bytespools,
}
}

// FromBytes creates a Buffer with an existed bytearray
func FromBytes(data []byte) *Buffer {
return &Buffer{
v: data,
end: int32(len(data)),
unmanaged: true,
ownership: unmanaged,
}
}

Expand All @@ -49,14 +66,19 @@ func StackNew() Buffer {

// Release recycles the buffer into an internal buffer pool.
func (b *Buffer) Release() {
if b == nil || b.v == nil || b.unmanaged {
if b == nil || b.v == nil || b.ownership == unmanaged {
return
}

p := b.v
b.v = nil
b.Clear()
pool.Put(p) // nolint: staticcheck
switch b.ownership {
case managed:
pool.Put(p) // nolint: staticcheck
case bytespools:
bytespool.Free(p) // nolint: staticcheck
}
}

// Clear clears the content of the buffer, results an empty buffer with
Expand Down Expand Up @@ -151,6 +173,14 @@ func (b *Buffer) Len() int32 {
return b.end - b.start
}

// Cap returns the capacity of the buffer content.
func (b *Buffer) Cap() int32 {
if b == nil {
return 0
}
return int32(len(b.v))
}

// IsEmpty returns true if the buffer is empty.
func (b *Buffer) IsEmpty() bool {
return b.Len() == 0
Expand Down

0 comments on commit 44be94a

Please sign in to comment.