From 374ca2159407c6f3ec786bc19e25da44ded62fcf Mon Sep 17 00:00:00 2001 From: Runxi Yu Date: Fri, 6 Mar 2026 11:22:29 +0800 Subject: internal/bufpool: Split files --- internal/bufpool/borrow.go | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 internal/bufpool/borrow.go (limited to 'internal/bufpool/borrow.go') diff --git a/internal/bufpool/borrow.go b/internal/bufpool/borrow.go new file mode 100644 index 00000000..ff212a9b --- /dev/null +++ b/internal/bufpool/borrow.go @@ -0,0 +1,31 @@ +package bufpool + +// Borrow retrieves a Buffer suitable for storing up to capHint bytes. +// The returned Buffer may come from an internal sync.Pool. +// +// If capHint is smaller than DefaultBufferCap, it is automatically raised +// to DefaultBufferCap. If no pooled buffer has sufficient capacity, a new +// unpooled buffer is allocated. +// +// The caller must call Release() when finished using the returned Buffer. +func Borrow(capHint int) Buffer { + if capHint < DefaultBufferCap { + capHint = DefaultBufferCap + } + + classIdx, classCap, pooled := classFor(capHint) + if !pooled { + newBuf := make([]byte, 0, capHint) + + return Buffer{buf: newBuf, pool: unpooled} + } + //nolint:forcetypeassert + buf := bufferPools[classIdx].Get().(*[]byte) + if cap(*buf) < classCap { + *buf = make([]byte, 0, classCap) + } + + slice := (*buf)[:0] + + return Buffer{buf: slice, pool: poolIndex(classIdx)} //#nosec G115 +} -- cgit v1.3.1-10-gc9f91