Add a byte buffer pool
This commit is contained in:
49
pdu/bufpool.go
Normal file
49
pdu/bufpool.go
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
package pdu
|
||||||
|
|
||||||
|
import (
|
||||||
|
"sync"
|
||||||
|
)
|
||||||
|
|
||||||
|
type BufferPoolManager struct {
|
||||||
|
pools map[int]*sync.Pool
|
||||||
|
mu sync.Mutex
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewBufferPoolManager() *BufferPoolManager {
|
||||||
|
return &BufferPoolManager{
|
||||||
|
pools: make(map[int]*sync.Pool),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (bpm *BufferPoolManager) GetBuffer(size int) *([]uint8) {
|
||||||
|
bpm.mu.Lock()
|
||||||
|
pool, exists := bpm.pools[size]
|
||||||
|
if !exists {
|
||||||
|
pool = &sync.Pool{
|
||||||
|
New: func() interface{} {
|
||||||
|
buf := make([]uint8, size)
|
||||||
|
return &buf
|
||||||
|
},
|
||||||
|
}
|
||||||
|
bpm.pools[size] = pool
|
||||||
|
}
|
||||||
|
bpm.mu.Unlock()
|
||||||
|
return pool.Get().(*[]uint8)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (bpm *BufferPoolManager) PutBuffer(buf *([]uint8)) {
|
||||||
|
size := len(*buf)
|
||||||
|
bpm.mu.Lock()
|
||||||
|
pool, exists := bpm.pools[size]
|
||||||
|
if !exists {
|
||||||
|
bpm.mu.Unlock()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
bpm.mu.Unlock()
|
||||||
|
|
||||||
|
// Reset buffer (optional)
|
||||||
|
for i := range *buf {
|
||||||
|
(*buf)[i] = 0
|
||||||
|
}
|
||||||
|
pool.Put(buf)
|
||||||
|
}
|
Reference in New Issue
Block a user