123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- package pool
- import (
- "sync"
- "github.com/gobwas/pool/internal/pmath"
- )
- var DefaultPool = New(128, 65536)
- // Get pulls object whose generic size is at least of given size. It also
- // returns a real size of x for further pass to Put(). It returns -1 as real
- // size for nil x. Size >-1 does not mean that x is non-nil, so checks must be
- // done.
- //
- // Note that size could be ceiled to the next power of two.
- //
- // Get is a wrapper around DefaultPool.Get().
- func Get(size int) (interface{}, int) { return DefaultPool.Get(size) }
- // Put takes x and its size for future reuse.
- // Put is a wrapper around DefaultPool.Put().
- func Put(x interface{}, size int) { DefaultPool.Put(x, size) }
- // Pool contains logic of reusing objects distinguishable by size in generic
- // way.
- type Pool struct {
- pool map[int]*sync.Pool
- size func(int) int
- }
- // New creates new Pool that reuses objects which size is in logarithmic range
- // [min, max].
- //
- // Note that it is a shortcut for Custom() constructor with Options provided by
- // WithLogSizeMapping() and WithLogSizeRange(min, max) calls.
- func New(min, max int) *Pool {
- return Custom(
- WithLogSizeMapping(),
- WithLogSizeRange(min, max),
- )
- }
- // Custom creates new Pool with given options.
- func Custom(opts ...Option) *Pool {
- p := &Pool{
- pool: make(map[int]*sync.Pool),
- size: pmath.Identity,
- }
- c := (*poolConfig)(p)
- for _, opt := range opts {
- opt(c)
- }
- return p
- }
- // Get pulls object whose generic size is at least of given size.
- // It also returns a real size of x for further pass to Put() even if x is nil.
- // Note that size could be ceiled to the next power of two.
- func (p *Pool) Get(size int) (interface{}, int) {
- n := p.size(size)
- if pool := p.pool[n]; pool != nil {
- return pool.Get(), n
- }
- return nil, size
- }
- // Put takes x and its size for future reuse.
- func (p *Pool) Put(x interface{}, size int) {
- if pool := p.pool[size]; pool != nil {
- pool.Put(x)
- }
- }
- type poolConfig Pool
- // AddSize adds size n to the map.
- func (p *poolConfig) AddSize(n int) {
- p.pool[n] = new(sync.Pool)
- }
- // SetSizeMapping sets up incoming size mapping function.
- func (p *poolConfig) SetSizeMapping(size func(int) int) {
- p.size = size
- }
|