Replaced legacy `*.orly` module imports with `next.orly.dev/pkg` paths across the codebase for consistency. Removed legacy `go.mod` files from sub-packages, consolidating dependency management. Added Dockerfiles and configurations for benchmarking environments.
77 lines
1.4 KiB
Go
77 lines
1.4 KiB
Go
package bufpool
|
|
|
|
import (
|
|
"sync"
|
|
|
|
"next.orly.dev/pkg/utils/units"
|
|
)
|
|
|
|
const (
|
|
// BufferSize is the size of each buffer in the pool (1kb)
|
|
BufferSize = units.Kb
|
|
)
|
|
|
|
type B []byte
|
|
|
|
func (b B) ToBytes() []byte { return b }
|
|
|
|
var Pool = sync.Pool{
|
|
New: func() interface{} {
|
|
// Create a new buffer when the pool is empty
|
|
b := make([]byte, 0, BufferSize)
|
|
// log.T.C(
|
|
// func() string {
|
|
// ptr := unsafe.SliceData(b)
|
|
// return fmt.Sprintf("creating buffer at: %p", ptr)
|
|
// },
|
|
// )
|
|
return B(b)
|
|
},
|
|
}
|
|
|
|
// Get returns a buffer from the pool or creates a new one if the pool is empty.
|
|
//
|
|
// Example usage:
|
|
//
|
|
// buf := bufpool.Get()
|
|
// defer bufpool.Put(buf)
|
|
// // Use buf...
|
|
func Get() B {
|
|
b := Pool.Get().(B)
|
|
// log.T.C(
|
|
// func() string {
|
|
// ptr := unsafe.SliceData(b)
|
|
// return fmt.Sprintf("getting buffer at: %p", ptr)
|
|
// },
|
|
// )
|
|
return b
|
|
}
|
|
|
|
// Put returns a buffer to the pool.
|
|
// Buffers should be returned to the pool when no longer needed to allow reuse.
|
|
func Put(b B) {
|
|
for i := range b {
|
|
(b)[i] = 0
|
|
}
|
|
b = b[:0]
|
|
// log.T.C(
|
|
// func() string {
|
|
// ptr := unsafe.SliceData(b)
|
|
// return fmt.Sprintf("returning to buffer: %p", ptr)
|
|
// },
|
|
// )
|
|
Pool.Put(b)
|
|
}
|
|
|
|
// PutBytes returns a buffer was not necessarily created by Get().
|
|
func PutBytes(b []byte) {
|
|
// log.T.C(
|
|
// func() string {
|
|
// ptr := unsafe.SliceData(b)
|
|
// return fmt.Sprintf("returning bytes to buffer: %p", ptr)
|
|
// },
|
|
// )
|
|
b = b[:0]
|
|
Put(b)
|
|
}
|