mirror of
https://github.com/TeaOSLab/EdgeNode.git
synced 2025-11-03 23:20:25 +08:00
74 lines
1.5 KiB
Go
74 lines
1.5 KiB
Go
// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
|
|
|
|
package expires
|
|
|
|
import (
|
|
"github.com/TeaOSLab/EdgeNode/internal/utils/goman"
|
|
"github.com/TeaOSLab/EdgeNode/internal/utils/zero"
|
|
"sync"
|
|
"time"
|
|
)
|
|
|
|
var SharedManager = NewManager()
|
|
|
|
type Manager struct {
|
|
listMap map[*List]zero.Zero
|
|
locker sync.Mutex
|
|
ticker *time.Ticker
|
|
}
|
|
|
|
func NewManager() *Manager {
|
|
var manager = &Manager{
|
|
listMap: map[*List]zero.Zero{},
|
|
ticker: time.NewTicker(1 * time.Second),
|
|
}
|
|
goman.New(func() {
|
|
manager.init()
|
|
})
|
|
return manager
|
|
}
|
|
|
|
func (this *Manager) init() {
|
|
var lastTimestamp = int64(0)
|
|
for range this.ticker.C {
|
|
var currentTime = time.Now().Unix()
|
|
if lastTimestamp == 0 {
|
|
lastTimestamp = currentTime - 86400 // prevent timezone changes
|
|
}
|
|
|
|
if currentTime >= lastTimestamp {
|
|
for i := lastTimestamp; i <= currentTime; i++ {
|
|
this.locker.Lock()
|
|
for list := range this.listMap {
|
|
list.GC(i)
|
|
}
|
|
this.locker.Unlock()
|
|
}
|
|
} else {
|
|
// 如果过去的时间比现在大,则从这一秒重新开始
|
|
for i := currentTime; i <= currentTime; i++ {
|
|
this.locker.Lock()
|
|
for list := range this.listMap {
|
|
list.GC(i)
|
|
}
|
|
this.locker.Unlock()
|
|
}
|
|
}
|
|
|
|
// 这样做是为了防止系统时钟突变
|
|
lastTimestamp = currentTime
|
|
}
|
|
}
|
|
|
|
func (this *Manager) Add(list *List) {
|
|
this.locker.Lock()
|
|
this.listMap[list] = zero.New()
|
|
this.locker.Unlock()
|
|
}
|
|
|
|
func (this *Manager) Remove(list *List) {
|
|
this.locker.Lock()
|
|
delete(this.listMap, list)
|
|
this.locker.Unlock()
|
|
}
|