cache.go (904B)
1 package main 2 3 import ( 4 "golang.org/x/net/dns/dnsmessage" 5 "sync" 6 ) 7 8 var cache = struct { 9 m map[dnsmessage.Name]map[dnsmessage.Type][]dnsmessage.Resource 10 sync.RWMutex 11 }{m: make(map[dnsmessage.Name]map[dnsmessage.Type][]dnsmessage.Resource)} 12 13 func lookup(n dnsmessage.Name, t dnsmessage.Type) ([]dnsmessage.Resource, bool) { 14 cache.RLock() 15 if rr, ok := cache.m[n][t]; ok { 16 cache.RUnlock() 17 if expired(n, t) { 18 cache.Lock() 19 delete(cache.m[n], t) 20 cache.Unlock() 21 return nil, false 22 } 23 return rr, true 24 } 25 l := len(cache.m[n]) 26 cache.RUnlock() 27 if l < 1 { 28 cache.Lock() 29 cache.m[n] = make(map[dnsmessage.Type][]dnsmessage.Resource) 30 cache.Unlock() 31 } 32 return nil, false 33 } 34 35 func insert(n dnsmessage.Name, t dnsmessage.Type, rrs []dnsmessage.Resource) { 36 cache.Lock() 37 cache.m[n][t] = rrs 38 cache.Unlock() 39 return 40 } 41 42 func expired(n dnsmessage.Name, t dnsmessage.Type) bool { return false }