iris/cache/entry/pool.go
2023-09-26 21:14:57 +03:00

70 lines
1.7 KiB
Go

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)
}