mirror of
				https://github.com/TeaOSLab/EdgeNode.git
				synced 2025-11-04 07:40:56 +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/goman"
 | 
						|
	"github.com/TeaOSLab/EdgeNode/internal/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()
 | 
						|
}
 |