1
0
mirror of https://github.com/v2fly/v2ray-core.git synced 2024-06-30 19:15:23 +00:00

Add bytespools ownership for buf.Buffer

This commit is contained in:
Vigilans 2023-02-18 03:59:20 +08:00 committed by Shelikhoo
parent 8b3215c72a
commit 44be94a0e7
No known key found for this signature in database
GPG Key ID: C4D5E79D22B25316

View File

@ -13,6 +13,15 @@ const (
var pool = bytespool.GetPool(Size) 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 // 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 // the buffer into an internal buffer pool, in order to recreate a buffer more
// quickly. // quickly.
@ -20,7 +29,7 @@ type Buffer struct {
v []byte v []byte
start int32 start int32
end int32 end int32
unmanaged bool ownership ownership
} }
// New creates a Buffer with 0 length and 2K capacity. // New creates a Buffer with 0 length and 2K capacity.
@ -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 // FromBytes creates a Buffer with an existed bytearray
func FromBytes(data []byte) *Buffer { func FromBytes(data []byte) *Buffer {
return &Buffer{ return &Buffer{
v: data, v: data,
end: int32(len(data)), end: int32(len(data)),
unmanaged: true, ownership: unmanaged,
} }
} }
@ -49,14 +66,19 @@ func StackNew() Buffer {
// Release recycles the buffer into an internal buffer pool. // Release recycles the buffer into an internal buffer pool.
func (b *Buffer) Release() { func (b *Buffer) Release() {
if b == nil || b.v == nil || b.unmanaged { if b == nil || b.v == nil || b.ownership == unmanaged {
return return
} }
p := b.v p := b.v
b.v = nil b.v = nil
b.Clear() 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 // Clear clears the content of the buffer, results an empty buffer with
@ -151,6 +173,14 @@ func (b *Buffer) Len() int32 {
return b.end - b.start 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. // IsEmpty returns true if the buffer is empty.
func (b *Buffer) IsEmpty() bool { func (b *Buffer) IsEmpty() bool {
return b.Len() == 0 return b.Len() == 0