Darien Raymond 8 роки тому
батько
коміт
a8da85eca5
1 змінених файлів з 14 додано та 20 видалено
  1. 14 20
      common/buf/buffer_pool.go

+ 14 - 20
common/buf/buffer_pool.go

@@ -40,26 +40,22 @@ func (p *SyncPool) Allocate() *Buffer {
 
 // Free implements Pool.Free().
 func (p *SyncPool) Free(buffer *Buffer) {
-	rawBuffer := buffer.v
-	if rawBuffer == nil {
-		return
+	if buffer.v != nil {
+		p.allocator.Put(buffer.v)
 	}
-	p.allocator.Put(rawBuffer)
 }
 
 // BufferPool is a Pool that utilizes an internal cache.
 type BufferPool struct {
-	chain     chan []byte
-	allocator *sync.Pool
+	chain chan []byte
+	sub   Pool
 }
 
 // NewBufferPool creates a new BufferPool with given buffer size, and internal cache size.
 func NewBufferPool(bufferSize, poolSize uint32) *BufferPool {
 	pool := &BufferPool{
 		chain: make(chan []byte, poolSize),
-		allocator: &sync.Pool{
-			New: func() interface{} { return make([]byte, bufferSize) },
-		},
+		sub:   NewSyncPool(bufferSize),
 	}
 	for i := uint32(0); i < poolSize; i++ {
 		pool.chain <- make([]byte, bufferSize)
@@ -69,28 +65,26 @@ func NewBufferPool(bufferSize, poolSize uint32) *BufferPool {
 
 // Allocate implements Pool.Allocate().
 func (p *BufferPool) Allocate() *Buffer {
-	var b []byte
 	select {
-	case b = <-p.chain:
+	case b := <-p.chain:
+		return &Buffer{
+			v:    b,
+			pool: p,
+		}
 	default:
-		b = p.allocator.Get().([]byte)
-	}
-	return &Buffer{
-		v:    b,
-		pool: p,
+		return p.sub.Allocate()
 	}
 }
 
 // Free implements Pool.Free().
 func (p *BufferPool) Free(buffer *Buffer) {
-	rawBuffer := buffer.v
-	if rawBuffer == nil {
+	if buffer.v == nil {
 		return
 	}
 	select {
-	case p.chain <- rawBuffer:
+	case p.chain <- buffer.v:
 	default:
-		p.allocator.Put(rawBuffer)
+		p.sub.Free(buffer)
 	}
 }