-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathbuilder_pool.go
72 lines (62 loc) · 1.9 KB
/
builder_pool.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
package vimebu
import "sync"
const (
// smallBufferSize is an initial allocation minimal capacity.
smallBufferSize int = 64
)
var (
defaultBuilderPool = NewBuilderPool()
)
// NewBuilderPool creates a new [BuilderPool] instance.
func NewBuilderPool() *BuilderPool {
return &BuilderPool{
pool: sync.Pool{
New: func() any {
return &Builder{
buf: make([]byte, 0, smallBufferSize),
}
},
},
}
}
// BuilderPool is a strongly typed wrapper around a [sync.Pool], specifically used to
// store and retrieve [Builder] instances.
type BuilderPool struct {
pool sync.Pool
}
// Acquire returns an empty [Builder] instance from the specified pool.
//
// Release the [Builder] with [BuilderPool.Release] after the [Builder] is no longer needed.
// This allows reducing GC load.
func (p *BuilderPool) Acquire() *Builder {
return p.pool.Get().(*Builder)
}
// AcquireBuilder returns an empty [Builder] instance from the default builder pool.
//
// Release the [Builder] with [ReleaseBuilder] after the [Builder] is no longer needed.
// This allows reducing GC load.
func AcquireBuilder() *Builder {
return defaultBuilderPool.Acquire()
}
// Release releases the [Builder] acquired via [BuilderPool.Acquire] to the specified pool.
//
// The released [Builder] mustn't be used after releasing it, otherwise data races
// may occur.
func (p *BuilderPool) Release(b *Builder) {
b.Reset()
p.pool.Put(b)
}
// Release releases the [Builder] acquired via [AcquireBuilder] to the default builder pool.
//
// The released [Builder] mustn't be used after releasing it, otherwise data races
// may occur.
func ReleaseBuilder(b *Builder) {
defaultBuilderPool.Release(b)
}
// Metric acquires and returns a zeroed-out [Builder] instance from the
// specified pool and sets the metric's name.
func (p *BuilderPool) Metric(name string, options ...BuilderOption) *Builder {
b := p.Acquire()
b.pool = p
return b.Metric(name, options...)
}