59 lines
		
	
	
		
			1015 B
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			59 lines
		
	
	
		
			1015 B
		
	
	
	
		
			Go
		
	
	
	
	
	
package pdu
 | 
						|
 | 
						|
import (
 | 
						|
	"sync"
 | 
						|
)
 | 
						|
 | 
						|
type BufferPoolManager struct {
 | 
						|
	pools map[uint]*sync.Pool
 | 
						|
	mu    sync.RWMutex
 | 
						|
}
 | 
						|
 | 
						|
func NewBufferPoolManager() *BufferPoolManager {
 | 
						|
	return &BufferPoolManager{
 | 
						|
		pools: make(map[uint]*sync.Pool),
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func (bpm *BufferPoolManager) Get(size uint) *[]uint8 {
 | 
						|
	bpm.mu.RLock()
 | 
						|
	pool, exists := bpm.pools[size]
 | 
						|
	bpm.mu.RUnlock()
 | 
						|
 | 
						|
	if !exists {
 | 
						|
		bpm.mu.Lock()
 | 
						|
		// Double-check if another goroutine added the pool while we were waiting
 | 
						|
		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) Put(buf *[]uint8) {
 | 
						|
	size := uint(len(*buf))
 | 
						|
	bpm.mu.RLock()
 | 
						|
	pool, exists := bpm.pools[size]
 | 
						|
	bpm.mu.RUnlock()
 | 
						|
 | 
						|
	if !exists {
 | 
						|
		return
 | 
						|
	}
 | 
						|
 | 
						|
	// Clear buffer
 | 
						|
	for i := range *buf {
 | 
						|
		(*buf)[i] = 0
 | 
						|
	}
 | 
						|
 | 
						|
	pool.Put(buf)
 | 
						|
}
 |