Pull request: 2476 rwmutex

Updates #2476.

* commit '52575d0247d5411d26083d4c186d39d8098b916e':
  util: imp autohosts
  Use a RWMutex instead of a Mutex for authosts
This commit is contained in:
Ainar Garipov 2021-03-03 16:25:07 +03:00
commit 8aa8be2921
1 changed files with 14 additions and 12 deletions

View File

@ -21,7 +21,7 @@ type onChangedT func()
// AutoHosts - automatic DNS records // AutoHosts - automatic DNS records
type AutoHosts struct { type AutoHosts struct {
// lock protects table and tableReverse. // lock protects table and tableReverse.
lock sync.Mutex lock sync.RWMutex
// table is the host-to-IPs map. // table is the host-to-IPs map.
table map[string][]net.IP table map[string][]net.IP
// tableReverse is the IP-to-hosts map. // tableReverse is the IP-to-hosts map.
@ -119,15 +119,14 @@ func (a *AutoHosts) Process(host string, qtype uint16) []net.IP {
} }
var ipsCopy []net.IP var ipsCopy []net.IP
a.lock.Lock() a.lock.RLock()
defer a.lock.RUnlock()
if ips, ok := a.table[host]; ok { if ips, ok := a.table[host]; ok {
ipsCopy = make([]net.IP, len(ips)) ipsCopy = make([]net.IP, len(ips))
copy(ipsCopy, ips) copy(ipsCopy, ips)
} }
a.lock.Unlock()
log.Debug("AutoHosts: answer: %s -> %v", host, ipsCopy) log.Debug("AutoHosts: answer: %s -> %v", host, ipsCopy)
return ipsCopy return ipsCopy
} }
@ -145,8 +144,8 @@ func (a *AutoHosts) ProcessReverse(addr string, qtype uint16) (hosts []string) {
ipStr := ipReal.String() ipStr := ipReal.String()
a.lock.Lock() a.lock.RLock()
defer a.lock.Unlock() defer a.lock.RUnlock()
hosts = a.tableReverse[ipStr] hosts = a.tableReverse[ipStr]
@ -161,8 +160,8 @@ func (a *AutoHosts) ProcessReverse(addr string, qtype uint16) (hosts []string) {
// List returns an IP-to-hostnames table. It is safe for concurrent use. // List returns an IP-to-hostnames table. It is safe for concurrent use.
func (a *AutoHosts) List() (ipToHosts map[string][]string) { func (a *AutoHosts) List() (ipToHosts map[string][]string) {
a.lock.Lock() a.lock.RLock()
defer a.lock.Unlock() defer a.lock.RUnlock()
ipToHosts = make(map[string][]string, len(a.tableReverse)) ipToHosts = make(map[string][]string, len(a.tableReverse))
for k, v := range a.tableReverse { for k, v := range a.tableReverse {
@ -339,10 +338,13 @@ func (a *AutoHosts) updateHosts() {
} }
} }
a.lock.Lock() func() {
a.table = table a.lock.Lock()
a.tableReverse = tableRev defer a.lock.Unlock()
a.lock.Unlock()
a.table = table
a.tableReverse = tableRev
}()
a.notify() a.notify()
} }