mirror of
https://github.com/v2fly/v2ray-core.git
synced 2024-12-23 02:26:49 -05:00
71 lines
1.1 KiB
Go
71 lines
1.1 KiB
Go
|
package rules
|
||
|
|
||
|
import (
|
||
|
"sync"
|
||
|
"time"
|
||
|
)
|
||
|
|
||
|
type RoutingEntry struct {
|
||
|
tag string
|
||
|
err error
|
||
|
expire time.Time
|
||
|
}
|
||
|
|
||
|
func (this *RoutingEntry) Extend() {
|
||
|
this.expire = time.Now().Add(time.Hour)
|
||
|
}
|
||
|
|
||
|
func (this *RoutingEntry) Expired() bool {
|
||
|
return this.expire.Before(time.Now())
|
||
|
}
|
||
|
|
||
|
type RoutingTable struct {
|
||
|
sync.RWMutex
|
||
|
table map[string]*RoutingEntry
|
||
|
}
|
||
|
|
||
|
func NewRoutingTable() *RoutingTable {
|
||
|
return &RoutingTable{
|
||
|
table: make(map[string]*RoutingEntry),
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (this *RoutingTable) Cleanup() {
|
||
|
this.Lock()
|
||
|
defer this.Unlock()
|
||
|
|
||
|
for key, value := range this.table {
|
||
|
if value.Expired() {
|
||
|
delete(this.table, key)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (this *RoutingTable) Set(destination string, tag string, err error) {
|
||
|
this.Lock()
|
||
|
defer this.Unlock()
|
||
|
|
||
|
entry := &RoutingEntry{
|
||
|
tag: tag,
|
||
|
err: err,
|
||
|
}
|
||
|
entry.Extend()
|
||
|
this.table[destination] = entry
|
||
|
|
||
|
if len(this.table) > 1000 {
|
||
|
go this.Cleanup()
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (this *RoutingTable) Get(destination string) (bool, string, error) {
|
||
|
this.RLock()
|
||
|
defer this.RUnlock()
|
||
|
|
||
|
entry, found := this.table[destination]
|
||
|
if !found {
|
||
|
return false, "", nil
|
||
|
}
|
||
|
entry.Extend()
|
||
|
return true, entry.tag, entry.err
|
||
|
}
|