shithub: furgit

ref: df1f2fb3daa1acd25c88510f259d5535fb482126
dir: /internal/bufpool/borrow.go/

View raw version
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
}