|
|
|
@ -42,15 +42,17 @@ func (queue *timedQueue) Pop() interface{} {
|
|
|
|
|
|
|
|
|
|
type TimedStringMap struct {
|
|
|
|
|
timedQueue
|
|
|
|
|
access sync.RWMutex
|
|
|
|
|
data map[string]interface{}
|
|
|
|
|
interval int
|
|
|
|
|
queueMutex sync.Mutex
|
|
|
|
|
dataMutext sync.RWMutex
|
|
|
|
|
data map[string]interface{}
|
|
|
|
|
interval int
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func NewTimedStringMap(updateInterval int) *TimedStringMap {
|
|
|
|
|
m := &TimedStringMap{
|
|
|
|
|
timedQueue: make([]*timedQueueEntry, 0, 1024),
|
|
|
|
|
access: sync.RWMutex{},
|
|
|
|
|
queueMutex: sync.Mutex{},
|
|
|
|
|
dataMutext: sync.RWMutex{},
|
|
|
|
|
data: make(map[string]interface{}, 1024),
|
|
|
|
|
interval: updateInterval,
|
|
|
|
|
}
|
|
|
|
@ -74,33 +76,36 @@ func (m *TimedStringMap) cleanup(tick <-chan time.Time) {
|
|
|
|
|
if entry.timeSec > nowSec {
|
|
|
|
|
break
|
|
|
|
|
}
|
|
|
|
|
m.access.Lock()
|
|
|
|
|
m.queueMutex.Lock()
|
|
|
|
|
entry = heap.Pop(&m.timedQueue).(*timedQueueEntry)
|
|
|
|
|
m.access.Unlock()
|
|
|
|
|
m.queueMutex.Unlock()
|
|
|
|
|
m.Remove(entry.value.(string))
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (m *TimedStringMap) Get(key string) (interface{}, bool) {
|
|
|
|
|
m.access.RLock()
|
|
|
|
|
m.dataMutext.RLock()
|
|
|
|
|
value, ok := m.data[key]
|
|
|
|
|
m.access.RUnlock()
|
|
|
|
|
m.dataMutext.RUnlock()
|
|
|
|
|
return value, ok
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (m *TimedStringMap) Set(key string, value interface{}, time2Delete int64) {
|
|
|
|
|
m.access.Lock()
|
|
|
|
|
m.dataMutext.Lock()
|
|
|
|
|
m.data[key] = value
|
|
|
|
|
m.dataMutext.Unlock()
|
|
|
|
|
|
|
|
|
|
m.queueMutex.Lock()
|
|
|
|
|
heap.Push(&m.timedQueue, &timedQueueEntry{
|
|
|
|
|
timeSec: time2Delete,
|
|
|
|
|
value: key,
|
|
|
|
|
})
|
|
|
|
|
m.access.Unlock()
|
|
|
|
|
m.queueMutex.Unlock()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (m *TimedStringMap) Remove(key string) {
|
|
|
|
|
m.access.Lock()
|
|
|
|
|
m.dataMutext.Lock()
|
|
|
|
|
delete(m.data, key)
|
|
|
|
|
m.access.Unlock()
|
|
|
|
|
m.dataMutext.Unlock()
|
|
|
|
|
}
|
|
|
|
|