| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 | package collectimport (	"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}
 |