mirror of
https://github.com/kataras/iris.git
synced 2025-01-23 18:51:03 +01:00
70 lines
1.7 KiB
Go
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)
|
|
}
|