influxdb/tsdb/engine/tsm1/pools.go

148 lines
2.7 KiB
Go
Raw Normal View History

2015-11-24 16:44:37 +00:00
package tsm1
import "sync"
var (
bufPool sync.Pool
float64ValuePool sync.Pool
int64ValuePool sync.Pool
2015-11-04 21:06:06 +00:00
booleanValuePool sync.Pool
2015-11-24 16:44:37 +00:00
stringValuePool sync.Pool
)
// getBuf returns a buffer with length size from the buffer pool.
func getBuf(size int) []byte {
x := bufPool.Get()
if x == nil {
return make([]byte, size)
}
buf := x.([]byte)
if cap(buf) < size {
return make([]byte, size)
}
return buf[:size]
}
// putBuf returns a buffer to the pool.
func putBuf(buf []byte) {
bufPool.Put(buf)
}
// getBuf returns a buffer with length size from the buffer pool.
func getFloat64Values(size int) []Value {
var buf []Value
x := float64ValuePool.Get()
if x == nil {
buf = make([]Value, size)
} else {
buf = x.([]Value)
}
if cap(buf) < size {
return make([]Value, size)
}
for i, v := range buf {
if v == nil {
buf[i] = &FloatValue{}
}
}
return buf[:size]
}
// putBuf returns a buffer to the pool.
func putFloat64Values(buf []Value) {
float64ValuePool.Put(buf)
}
// getBuf returns a buffer with length size from the buffer pool.
func getInt64Values(size int) []Value {
var buf []Value
x := int64ValuePool.Get()
if x == nil {
buf = make([]Value, size)
} else {
buf = x.([]Value)
}
if cap(buf) < size {
return make([]Value, size)
}
for i, v := range buf {
if v == nil {
buf[i] = &Int64Value{}
}
}
return buf[:size]
}
// putBuf returns a buffer to the pool.
func putInt64Values(buf []Value) {
int64ValuePool.Put(buf)
}
// getBuf returns a buffer with length size from the buffer pool.
2015-11-04 21:06:06 +00:00
func getBooleanValues(size int) []Value {
2015-11-24 16:44:37 +00:00
var buf []Value
2015-11-04 21:06:06 +00:00
x := booleanValuePool.Get()
2015-11-24 16:44:37 +00:00
if x == nil {
buf = make([]Value, size)
} else {
buf = x.([]Value)
}
if cap(buf) < size {
return make([]Value, size)
}
for i, v := range buf {
if v == nil {
2015-11-04 21:06:06 +00:00
buf[i] = &BooleanValue{}
2015-11-24 16:44:37 +00:00
}
}
return buf[:size]
}
// putBuf returns a buffer to the pool.
func putStringValues(buf []Value) {
stringValuePool.Put(buf)
}
// getBuf returns a buffer with length size from the buffer pool.
func getStringValues(size int) []Value {
var buf []Value
x := stringValuePool.Get()
if x == nil {
buf = make([]Value, size)
} else {
buf = x.([]Value)
}
if cap(buf) < size {
return make([]Value, size)
}
for i, v := range buf {
if v == nil {
buf[i] = &StringValue{}
}
}
return buf[:size]
}
// putBuf returns a buffer to the pool.
2015-11-04 21:06:06 +00:00
func putBooleanValues(buf []Value) {
booleanValuePool.Put(buf)
2015-11-24 16:44:37 +00:00
}
func putValue(buf []Value) {
if len(buf) > 0 {
switch buf[0].(type) {
case *FloatValue:
putFloat64Values(buf)
case *Int64Value:
putInt64Values(buf)
2015-11-04 21:06:06 +00:00
case *BooleanValue:
putBooleanValues(buf)
2015-11-24 16:44:37 +00:00
case *StringValue:
2015-11-04 21:06:06 +00:00
putStringValues(buf)
2015-11-24 16:44:37 +00:00
}
}
}