55 lines
920 B
Go
55 lines
920 B
Go
package ccache
|
|
|
|
import (
|
|
"container/list"
|
|
"sync"
|
|
"sync/atomic"
|
|
"time"
|
|
)
|
|
|
|
type TrackedItem interface {
|
|
Value() interface{}
|
|
Release()
|
|
}
|
|
|
|
type nilItem struct{}
|
|
|
|
func (n *nilItem) Value() interface{} { return nil }
|
|
func (n *nilItem) Release() {}
|
|
|
|
var NilTracked = new(nilItem)
|
|
|
|
type Item struct {
|
|
key string
|
|
sync.RWMutex
|
|
promotions int32
|
|
refCount int32
|
|
expires time.Time
|
|
value interface{}
|
|
element *list.Element
|
|
}
|
|
|
|
func newItem(key string, value interface{}, expires time.Time) *Item {
|
|
return &Item{
|
|
key: key,
|
|
value: value,
|
|
promotions: -1,
|
|
expires: expires,
|
|
}
|
|
}
|
|
|
|
func (i *Item) shouldPromote(getsPerPromote int32) bool {
|
|
return atomic.AddInt32(&i.promotions, 1) == getsPerPromote
|
|
}
|
|
|
|
func (i *Item) Value() interface{} {
|
|
return i.value
|
|
}
|
|
|
|
func (i *Item) track() {
|
|
atomic.AddInt32(&i.refCount, 1)
|
|
}
|
|
|
|
func (i *Item) Release() {
|
|
atomic.AddInt32(&i.refCount, -1)
|
|
}
|