Switch to flag based cache validation

This commit is contained in:
Daniel 2021-03-29 13:45:50 +02:00
parent d16810c0e9
commit 99c8c801eb
2 changed files with 25 additions and 29 deletions

View file

@ -7,7 +7,6 @@ import (
"os" "os"
"strings" "strings"
"sync" "sync"
"time"
"github.com/miekg/dns" "github.com/miekg/dns"
@ -15,35 +14,25 @@ import (
"github.com/safing/portmaster/network/netutils" "github.com/safing/portmaster/network/netutils"
) )
const (
gatewaysRecheck = 2 * time.Second
nameserversRecheck = 2 * time.Second
)
var ( var (
gateways = make([]net.IP, 0) gateways = make([]net.IP, 0)
gatewaysLock sync.Mutex gatewaysLock sync.Mutex
gatewaysExpires = time.Now() gatewaysNetworkChangedFlag = GetNetworkChangedFlag()
nameservers = make([]Nameserver, 0) nameservers = make([]Nameserver, 0)
nameserversLock sync.Mutex nameserversLock sync.Mutex
nameserversExpires = time.Now() nameserversNetworkChangedFlag = GetNetworkChangedFlag()
) )
// Gateways returns the currently active gateways. // Gateways returns the currently active gateways.
func Gateways() []net.IP { func Gateways() []net.IP {
// locking
gatewaysLock.Lock() gatewaysLock.Lock()
defer gatewaysLock.Unlock() defer gatewaysLock.Unlock()
// cache // Check if the network changed, if not, return cache.
if gatewaysExpires.After(time.Now()) { if !gatewaysNetworkChangedFlag.IsSet() {
return gateways return gateways
} }
// update cache expiry when finished gatewaysNetworkChangedFlag.Refresh()
defer func() {
gatewaysExpires = time.Now().Add(gatewaysRecheck)
}()
// logic
gateways = make([]net.IP, 0) gateways = make([]net.IP, 0)
var decoded []byte var decoded []byte
@ -119,17 +108,13 @@ func Gateways() []net.IP {
// Nameservers returns the currently active nameservers. // Nameservers returns the currently active nameservers.
func Nameservers() []Nameserver { func Nameservers() []Nameserver {
// locking
nameserversLock.Lock() nameserversLock.Lock()
defer nameserversLock.Unlock() defer nameserversLock.Unlock()
// cache // Check if the network changed, if not, return cache.
if nameserversExpires.After(time.Now()) { if !nameserversNetworkChangedFlag.IsSet() {
return nameservers return nameservers
} }
// update cache expiry when finished nameserversNetworkChangedFlag.Refresh()
defer func() {
nameserversExpires = time.Now().Add(nameserversRecheck)
}()
// logic // logic
// TODO: try: // TODO: try:

View file

@ -9,12 +9,23 @@ import (
"time" "time"
"github.com/safing/portbase/log" "github.com/safing/portbase/log"
"github.com/safing/portbase/utils"
) )
var ( var (
networkChangeCheckTrigger = make(chan struct{}, 1) networkChangeCheckTrigger = make(chan struct{}, 1)
networkChangedFlagController = utils.NewFlagController()
) )
func GetNetworkChangedFlag() *utils.Flag {
return networkChangedFlagController.NewFlag()
}
func notifyOfNetworkChange() {
networkChangedFlagController.NotifyAndReset()
module.TriggerEvent(NetworkChangedEvent, nil)
}
func triggerNetworkChangeCheck() { func triggerNetworkChangeCheck() {
select { select {
case networkChangeCheckTrigger <- struct{}{}: case networkChangeCheckTrigger <- struct{}{}:
@ -82,7 +93,7 @@ serviceLoop:
if trigger { if trigger {
triggerOnlineStatusInvestigation() triggerOnlineStatusInvestigation()
} }
module.TriggerEvent(NetworkChangedEvent, nil) notifyOfNetworkChange()
} }
} }