mirror of
https://github.com/VictoriaMetrics/VictoriaMetrics.git
synced 2024-12-18 14:40:26 +01:00
75 lines
1.1 KiB
Go
75 lines
1.1 KiB
Go
package logstorage
|
|
|
|
import (
|
|
"sync"
|
|
|
|
"github.com/VictoriaMetrics/VictoriaMetrics/lib/bytesutil"
|
|
"github.com/VictoriaMetrics/VictoriaMetrics/lib/slicesutil"
|
|
)
|
|
|
|
func getArena() *arena {
|
|
v := arenaPool.Get()
|
|
if v == nil {
|
|
return &arena{}
|
|
}
|
|
return v.(*arena)
|
|
}
|
|
|
|
func putArena(a *arena) {
|
|
a.reset()
|
|
arenaPool.Put(a)
|
|
}
|
|
|
|
var arenaPool sync.Pool
|
|
|
|
type arena struct {
|
|
b []byte
|
|
}
|
|
|
|
func (a *arena) reset() {
|
|
a.b = a.b[:0]
|
|
}
|
|
|
|
func (a *arena) preallocate(n int) {
|
|
a.b = slicesutil.ExtendCapacity(a.b, n)
|
|
}
|
|
|
|
func (a *arena) sizeBytes() int {
|
|
return cap(a.b)
|
|
}
|
|
|
|
func (a *arena) copyBytes(b []byte) []byte {
|
|
if len(b) == 0 {
|
|
return b
|
|
}
|
|
|
|
ab := a.b
|
|
abLen := len(ab)
|
|
ab = append(ab, b...)
|
|
a.b = ab
|
|
return ab[abLen:]
|
|
}
|
|
|
|
func (a *arena) copyBytesToString(b []byte) string {
|
|
bCopy := a.copyBytes(b)
|
|
return bytesutil.ToUnsafeString(bCopy)
|
|
}
|
|
|
|
func (a *arena) copyString(s string) string {
|
|
b := bytesutil.ToUnsafeBytes(s)
|
|
return a.copyBytesToString(b)
|
|
}
|
|
|
|
func (a *arena) newBytes(size int) []byte {
|
|
if size <= 0 {
|
|
return nil
|
|
}
|
|
|
|
ab := a.b
|
|
abLen := len(ab)
|
|
ab = bytesutil.ResizeWithCopyMayOverallocate(ab, abLen+size)
|
|
result := ab[abLen:]
|
|
a.b = ab
|
|
return result
|
|
}
|