| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- package collect
- import (
- "sync"
- "sync/atomic"
- "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
- opCount int32
- }
- func NewValidityMap(cleanupIntervalSec int) *ValidityMap {
- instance := &ValidityMap{
- cache: make(map[string]Validity),
- }
- return instance
- }
- func (this *ValidityMap) cleanup() {
- 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()
- opCount := atomic.AddInt32(&this.opCount, 1)
- if opCount > 1000 {
- atomic.StoreInt32(&this.opCount, 0)
- go this.cleanup()
- }
- }
- 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
- }
|