tidb pool 源码
tidb pool 代码
文件路径:/util/chunk/pool.go
// Copyright 2018 PingCAP, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package chunk
import (
"sync"
"github.com/pingcap/tidb/types"
)
// Pool is the Column pool.
// NOTE: Pool is non-copyable.
type Pool struct {
initCap int
varLenColPool *sync.Pool
fixLenColPool4 *sync.Pool
fixLenColPool8 *sync.Pool
fixLenColPool16 *sync.Pool
fixLenColPool40 *sync.Pool
}
// NewPool creates a new Pool.
func NewPool(initCap int) *Pool {
return &Pool{
initCap: initCap,
varLenColPool: &sync.Pool{New: func() interface{} { return newVarLenColumn(initCap) }},
fixLenColPool4: &sync.Pool{New: func() interface{} { return newFixedLenColumn(4, initCap) }},
fixLenColPool8: &sync.Pool{New: func() interface{} { return newFixedLenColumn(8, initCap) }},
fixLenColPool16: &sync.Pool{New: func() interface{} { return newFixedLenColumn(16, initCap) }},
fixLenColPool40: &sync.Pool{New: func() interface{} { return newFixedLenColumn(40, initCap) }},
}
}
// GetChunk gets a Chunk from the Pool.
func (p *Pool) GetChunk(fields []*types.FieldType) *Chunk {
chk := new(Chunk)
chk.capacity = p.initCap
chk.columns = make([]*Column, len(fields))
for i, f := range fields {
switch elemLen := getFixedLen(f); elemLen {
case varElemLen:
chk.columns[i] = p.varLenColPool.Get().(*Column)
case 4:
chk.columns[i] = p.fixLenColPool4.Get().(*Column)
case 8:
chk.columns[i] = p.fixLenColPool8.Get().(*Column)
case 16:
chk.columns[i] = p.fixLenColPool16.Get().(*Column)
case 40:
chk.columns[i] = p.fixLenColPool40.Get().(*Column)
}
}
return chk
}
// PutChunk puts a Chunk back to the Pool.
func (p *Pool) PutChunk(fields []*types.FieldType, chk *Chunk) {
for i, f := range fields {
switch elemLen := getFixedLen(f); elemLen {
case varElemLen:
p.varLenColPool.Put(chk.columns[i])
case 4:
p.fixLenColPool4.Put(chk.columns[i])
case 8:
p.fixLenColPool8.Put(chk.columns[i])
case 16:
p.fixLenColPool16.Put(chk.columns[i])
case 40:
p.fixLenColPool40.Put(chk.columns[i])
}
}
chk.columns = nil // release the Column references.
}
相关信息
相关文章
0
赞
热门推荐
-
2、 - 优质文章
-
3、 gate.io
-
8、 golang
-
9、 openharmony
-
10、 Vue中input框自动聚焦