mirror of https://github.com/v2ray/v2ray-core
				
				
				
			
		
			
				
	
	
		
			71 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Go
		
	
	
			
		
		
	
	
			71 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Go
		
	
	
| package router
 | |
| 
 | |
| 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
 | |
| }
 |