From 99c8c801eb1fcacb63ec56c6f03657be0b72587d Mon Sep 17 00:00:00 2001 From: Daniel Date: Mon, 29 Mar 2021 13:45:50 +0200 Subject: [PATCH] Switch to flag based cache validation --- netenv/environment_linux.go | 39 ++++++++++++------------------------- netenv/network-change.go | 15 ++++++++++++-- 2 files changed, 25 insertions(+), 29 deletions(-) diff --git a/netenv/environment_linux.go b/netenv/environment_linux.go index 31297de1..42f02750 100644 --- a/netenv/environment_linux.go +++ b/netenv/environment_linux.go @@ -7,7 +7,6 @@ import ( "os" "strings" "sync" - "time" "github.com/miekg/dns" @@ -15,35 +14,25 @@ import ( "github.com/safing/portmaster/network/netutils" ) -const ( - gatewaysRecheck = 2 * time.Second - nameserversRecheck = 2 * time.Second -) - var ( - gateways = make([]net.IP, 0) - gatewaysLock sync.Mutex - gatewaysExpires = time.Now() + gateways = make([]net.IP, 0) + gatewaysLock sync.Mutex + gatewaysNetworkChangedFlag = GetNetworkChangedFlag() - nameservers = make([]Nameserver, 0) - nameserversLock sync.Mutex - nameserversExpires = time.Now() + nameservers = make([]Nameserver, 0) + nameserversLock sync.Mutex + nameserversNetworkChangedFlag = GetNetworkChangedFlag() ) // Gateways returns the currently active gateways. func Gateways() []net.IP { - // locking gatewaysLock.Lock() defer gatewaysLock.Unlock() - // cache - if gatewaysExpires.After(time.Now()) { + // Check if the network changed, if not, return cache. + if !gatewaysNetworkChangedFlag.IsSet() { return gateways } - // update cache expiry when finished - defer func() { - gatewaysExpires = time.Now().Add(gatewaysRecheck) - }() - // logic + gatewaysNetworkChangedFlag.Refresh() gateways = make([]net.IP, 0) var decoded []byte @@ -119,17 +108,13 @@ func Gateways() []net.IP { // Nameservers returns the currently active nameservers. func Nameservers() []Nameserver { - // locking nameserversLock.Lock() defer nameserversLock.Unlock() - // cache - if nameserversExpires.After(time.Now()) { + // Check if the network changed, if not, return cache. + if !nameserversNetworkChangedFlag.IsSet() { return nameservers } - // update cache expiry when finished - defer func() { - nameserversExpires = time.Now().Add(nameserversRecheck) - }() + nameserversNetworkChangedFlag.Refresh() // logic // TODO: try: diff --git a/netenv/network-change.go b/netenv/network-change.go index 63f9b066..19a56085 100644 --- a/netenv/network-change.go +++ b/netenv/network-change.go @@ -9,12 +9,23 @@ import ( "time" "github.com/safing/portbase/log" + "github.com/safing/portbase/utils" ) 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() { select { case networkChangeCheckTrigger <- struct{}{}: @@ -82,7 +93,7 @@ serviceLoop: if trigger { triggerOnlineStatusInvestigation() } - module.TriggerEvent(NetworkChangedEvent, nil) + notifyOfNetworkChange() } }