-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathitem.go
81 lines (71 loc) · 1.43 KB
/
item.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
package mace
import (
"sync"
"time"
)
type MaceItem struct {
sync.RWMutex
key string // Far easier to use string keys
data interface{}
alive time.Duration
created time.Time
access time.Time
accessCount int
dispose *disposeItem
// Expire notification is trait of table structure
// Likely use case is item specific events are similar in nature
}
func NewMaceItem(key string, val interface{}, aliveUntil time.Duration) *MaceItem {
cur := time.Now()
m := &MaceItem{
key: key,
alive: aliveUntil,
created: cur,
access: cur,
data: val,
}
if aliveUntil != 0 {
cur := time.Now()
disposeTime := cur.Add(aliveUntil)
ditem := &disposeItem{
value: key,
disposeTime: disposeTime,
}
m.dispose = ditem
}
return m
}
func (item *MaceItem) KeepAlive() {
item.Lock()
item.access = time.Now()
item.accessCount++
if item.alive != 0 {
item.dispose.disposeTime = item.access.Add(item.alive)
}
item.Unlock()
return
}
func (item *MaceItem) Alive() time.Duration {
return item.alive
}
func (item *MaceItem) Key() string {
return item.key
}
func (item *MaceItem) Data() interface{} {
return item.data
}
func (item *MaceItem) AccessCount() int {
item.RLock()
r := item.accessCount
item.RUnlock()
return r
}
func (item *MaceItem) Created() time.Time {
return item.created
}
func (item *MaceItem) Access() time.Time {
item.RLock()
r := item.access
item.RUnlock()
return r
}