github.com/whtcorpsinc/MilevaDB-Prod@v0.0.0-20211104133533-f57f4be3b597/soliton/chunk/pool.go (about)

     1  // Copyright 2020 WHTCORPS INC, Inc.
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //     http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // See the License for the specific language governing permissions and
    12  // limitations under the License.
    13  
    14  package chunk
    15  
    16  import (
    17  	"sync"
    18  
    19  	"github.com/whtcorpsinc/milevadb/types"
    20  )
    21  
    22  // Pool is the DeferredCauset pool.
    23  // NOTE: Pool is non-copyable.
    24  type Pool struct {
    25  	initCap int
    26  
    27  	varLenDefCausPool   *sync.Pool
    28  	fixLenDefCausPool4  *sync.Pool
    29  	fixLenDefCausPool8  *sync.Pool
    30  	fixLenDefCausPool16 *sync.Pool
    31  	fixLenDefCausPool40 *sync.Pool
    32  }
    33  
    34  // NewPool creates a new Pool.
    35  func NewPool(initCap int) *Pool {
    36  	return &Pool{
    37  		initCap:         initCap,
    38  		varLenDefCausPool:   &sync.Pool{New: func() interface{} { return newVarLenDeferredCauset(initCap, nil) }},
    39  		fixLenDefCausPool4:  &sync.Pool{New: func() interface{} { return newFixedLenDeferredCauset(4, initCap) }},
    40  		fixLenDefCausPool8:  &sync.Pool{New: func() interface{} { return newFixedLenDeferredCauset(8, initCap) }},
    41  		fixLenDefCausPool16: &sync.Pool{New: func() interface{} { return newFixedLenDeferredCauset(16, initCap) }},
    42  		fixLenDefCausPool40: &sync.Pool{New: func() interface{} { return newFixedLenDeferredCauset(40, initCap) }},
    43  	}
    44  }
    45  
    46  // GetChunk gets a Chunk from the Pool.
    47  func (p *Pool) GetChunk(fields []*types.FieldType) *Chunk {
    48  	chk := new(Chunk)
    49  	chk.capacity = p.initCap
    50  	chk.defCausumns = make([]*DeferredCauset, len(fields))
    51  	for i, f := range fields {
    52  		switch elemLen := getFixedLen(f); elemLen {
    53  		case varElemLen:
    54  			chk.defCausumns[i] = p.varLenDefCausPool.Get().(*DeferredCauset)
    55  		case 4:
    56  			chk.defCausumns[i] = p.fixLenDefCausPool4.Get().(*DeferredCauset)
    57  		case 8:
    58  			chk.defCausumns[i] = p.fixLenDefCausPool8.Get().(*DeferredCauset)
    59  		case 16:
    60  			chk.defCausumns[i] = p.fixLenDefCausPool16.Get().(*DeferredCauset)
    61  		case 40:
    62  			chk.defCausumns[i] = p.fixLenDefCausPool40.Get().(*DeferredCauset)
    63  		}
    64  	}
    65  	return chk
    66  }
    67  
    68  // PutChunk puts a Chunk back to the Pool.
    69  func (p *Pool) PutChunk(fields []*types.FieldType, chk *Chunk) {
    70  	for i, f := range fields {
    71  		switch elemLen := getFixedLen(f); elemLen {
    72  		case varElemLen:
    73  			p.varLenDefCausPool.Put(chk.defCausumns[i])
    74  		case 4:
    75  			p.fixLenDefCausPool4.Put(chk.defCausumns[i])
    76  		case 8:
    77  			p.fixLenDefCausPool8.Put(chk.defCausumns[i])
    78  		case 16:
    79  			p.fixLenDefCausPool16.Put(chk.defCausumns[i])
    80  		case 40:
    81  			p.fixLenDefCausPool40.Put(chk.defCausumns[i])
    82  		}
    83  	}
    84  	chk.defCausumns = nil // release the DeferredCauset references.
    85  }