123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- package entry
- import (
- "sync"
- "time"
- "github.com/kataras/iris/v12/cache/cfg"
- "github.com/kataras/iris/v12/core/memstore"
- )
- // Pool is the context pool, it's used inside router and the framework by itself.
- type Pool struct {
- pool *sync.Pool
- }
- // NewPool creates and returns a new context pool.
- func NewPool() *Pool {
- return &Pool{pool: &sync.Pool{New: func() any { return &Entry{} }}}
- }
- // func NewPool(newFunc func() any) *Pool {
- // return &Pool{pool: &sync.Pool{New: newFunc}}
- // }
- // Acquire returns an Entry from pool.
- // See Release.
- func (c *Pool) Acquire(lifeDuration time.Duration, r *Response, onExpire func()) *Entry {
- // If the given duration is not <=0 (which means finds from the headers)
- // then we should check for the MinimumCacheDuration here
- if lifeDuration >= 0 && lifeDuration < cfg.MinimumCacheDuration {
- lifeDuration = cfg.MinimumCacheDuration
- }
- e := c.pool.Get().(*Entry)
- lt := memstore.NewLifeTime()
- lt.Begin(lifeDuration, func() {
- onExpire()
- c.release(e)
- })
- e.reset(lt, r)
- return e
- }
- // Release puts an Entry back to its pull, this function releases its resources.
- // See Acquire.
- func (c *Pool) release(e *Entry) {
- e.response.body = nil
- e.response.headers = nil
- e.response.statusCode = 0
- e.response = nil
- // do not call it, it contains a lock too, release is controlled only inside the Acquire itself when the entry is expired.
- // if e.lifeTime != nil {
- // e.lifeTime.ExpireNow() // stop any opening timers if force released.
- // }
- c.pool.Put(e)
- }
- // Release can be called by custom stores to release an entry.
- func (c *Pool) Release(e *Entry) {
- if e.lifeTime != nil {
- e.lifeTime.ExpireNow() // stop any opening timers if force released.
- }
- c.release(e)
- }
|