You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
85 lines
2.5 KiB
85 lines
2.5 KiB
// 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,
|
|
// 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, nil) }},
|
|
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.
|
|
}
|
|
|