2013-10-19 02:56:28 +02:00
|
|
|
package ccache
|
|
|
|
|
|
|
|
import (
|
2014-02-28 13:10:42 +01:00
|
|
|
"container/list"
|
|
|
|
"sync/atomic"
|
2013-10-19 02:56:28 +02:00
|
|
|
)
|
|
|
|
|
2014-02-28 13:10:42 +01:00
|
|
|
type TrackedItem interface {
|
|
|
|
Value() interface{}
|
|
|
|
Release()
|
|
|
|
}
|
|
|
|
|
|
|
|
type nilItem struct{}
|
|
|
|
|
|
|
|
func (n *nilItem) Value() interface{} { return nil }
|
|
|
|
func (n *nilItem) Release() {}
|
|
|
|
|
|
|
|
var NilTracked = new(nilItem)
|
|
|
|
|
2013-10-19 02:56:28 +02:00
|
|
|
type Item struct {
|
2014-02-28 13:10:42 +01:00
|
|
|
key string
|
2014-10-25 07:19:14 +02:00
|
|
|
group string
|
2014-02-28 13:10:42 +01:00
|
|
|
promotions int32
|
|
|
|
refCount int32
|
2014-10-25 03:35:52 +02:00
|
|
|
expires int64
|
2014-02-28 13:10:42 +01:00
|
|
|
value interface{}
|
|
|
|
element *list.Element
|
2013-10-19 02:56:28 +02:00
|
|
|
}
|
|
|
|
|
2014-10-25 04:44:22 +02:00
|
|
|
func newItem(key string, value interface{}, expires int64) *Item {
|
2014-02-28 13:10:42 +01:00
|
|
|
return &Item{
|
|
|
|
key: key,
|
|
|
|
value: value,
|
|
|
|
promotions: -1,
|
2014-10-25 04:44:22 +02:00
|
|
|
expires: expires,
|
2014-02-28 13:10:42 +01:00
|
|
|
}
|
2013-10-21 13:37:35 +02:00
|
|
|
}
|
|
|
|
|
2013-10-30 13:18:51 +01:00
|
|
|
func (i *Item) shouldPromote(getsPerPromote int32) bool {
|
2014-02-28 13:10:42 +01:00
|
|
|
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)
|
2013-10-19 02:56:28 +02:00
|
|
|
}
|