| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 | 
							- package collect
 
- import (
 
- 	"sync"
 
- 	"time"
 
- 	"github.com/v2ray/v2ray-core/common/serial"
 
- )
 
- type Validity interface {
 
- 	IsValid() bool
 
- }
 
- type entry struct {
 
- 	key   string
 
- 	value Validity
 
- }
 
- type ValidityMap struct {
 
- 	sync.RWMutex
 
- 	cache              map[string]Validity
 
- 	cleanupIntervalSec int
 
- }
 
- func NewValidityMap(cleanupIntervalSec int) *ValidityMap {
 
- 	instance := &ValidityMap{
 
- 		cache:              make(map[string]Validity),
 
- 		cleanupIntervalSec: cleanupIntervalSec,
 
- 	}
 
- 	go instance.cleanup()
 
- 	return instance
 
- }
 
- func (this *ValidityMap) cleanup() {
 
- 	for range time.Tick(time.Duration(this.cleanupIntervalSec) * time.Second) {
 
- 		entry2Remove := make([]entry, 0, 128)
 
- 		this.RLock()
 
- 		for key, value := range this.cache {
 
- 			if !value.IsValid() {
 
- 				entry2Remove = append(entry2Remove, entry{
 
- 					key:   key,
 
- 					value: value,
 
- 				})
 
- 			}
 
- 		}
 
- 		this.RUnlock()
 
- 		for _, entry := range entry2Remove {
 
- 			if !entry.value.IsValid() {
 
- 				this.Lock()
 
- 				delete(this.cache, entry.key)
 
- 				this.Unlock()
 
- 			}
 
- 		}
 
- 	}
 
- }
 
- func (this *ValidityMap) Set(key serial.String, value Validity) {
 
- 	this.Lock()
 
- 	this.cache[key.String()] = value
 
- 	this.Unlock()
 
- }
 
- func (this *ValidityMap) Get(key serial.String) Validity {
 
- 	this.RLock()
 
- 	defer this.RUnlock()
 
- 	if value, found := this.cache[key.String()]; found {
 
- 		return value
 
- 	}
 
- 	return nil
 
- }
 
 
  |