diff --git a/netenv/network-change.go b/netenv/network-change.go index 42fadae6..1188db2d 100644 --- a/netenv/network-change.go +++ b/netenv/network-change.go @@ -41,10 +41,13 @@ serviceLoop: for { trigger := false - timeout := 15 * time.Second - if !Online() { - timeout = time.Second + var ticker *time.Ticker + if Online() { + ticker = monitorNetworkChangeOnlineTicker + } else { + ticker = monitorNetworkChangeOfflineTicker } + // wait for trigger select { case <-ctx.Done(): @@ -54,7 +57,7 @@ serviceLoop: // triggers the networkChangeCheck this way. If we would set // trigger == true we would trigger the online check again // resulting in a loop of pointless checks. - case <-time.After(timeout): + case <-ticker.C: trigger = true } diff --git a/netenv/os_android.go b/netenv/os_android.go index ccea7877..84c36958 100644 --- a/netenv/os_android.go +++ b/netenv/os_android.go @@ -3,8 +3,20 @@ package netenv import ( "github.com/safing/portmaster-android/go/app_interface" "net" + "time" ) +var ( + monitorNetworkChangeOnlineTicker = time.NewTicker(time.Second) + monitorNetworkChangeOfflineTicker = time.NewTicker(time.Second) +) + +func init() { + // Network change event is monitored by the android system. + monitorNetworkChangeOnlineTicker.Stop() + monitorNetworkChangeOfflineTicker.Stop() +} + func osGetInterfaceAddrs() ([]net.Addr, error) { list, err := app_interface.GetNetworkAddresses() if err != nil { diff --git a/netenv/os_default.go b/netenv/os_default.go index 351d5c4c..def06761 100644 --- a/netenv/os_default.go +++ b/netenv/os_default.go @@ -4,6 +4,12 @@ package netenv import ( "net" + "time" +) + +var ( + monitorNetworkChangeOnlineTicker = time.NewTicker(15 * time.Second) + monitorNetworkChangeOfflineTicker = time.NewTicker(time.Second) ) func osGetInterfaceAddrs() ([]net.Addr, error) { diff --git a/network/clean.go b/network/clean.go index 8431ae2e..c8ba195b 100644 --- a/network/clean.go +++ b/network/clean.go @@ -19,14 +19,14 @@ const ( ) func connectionCleaner(ctx context.Context) error { - ticker := time.NewTicker(cleanerTickDuration) + ticker := module.NewSleepyTicker(cleanerTickDuration, 0) for { select { case <-ctx.Done(): ticker.Stop() return nil - case <-ticker.C: + case <-ticker.Read(): // clean connections and processes activePIDs := cleanConnections() process.CleanProcessStorage(activePIDs) diff --git a/network/dns.go b/network/dns.go index d016783e..5e8ad812 100644 --- a/network/dns.go +++ b/network/dns.go @@ -84,14 +84,14 @@ func SaveOpenDNSRequest(q *resolver.Query, rrCache *resolver.RRCache, conn *Conn } func openDNSRequestWriter(ctx context.Context) error { - ticker := time.NewTicker(writeOpenDNSRequestsTickDuration) + ticker := module.NewSleepyTicker(writeOpenDNSRequestsTickDuration, 0) defer ticker.Stop() for { select { case <-ctx.Done(): return nil - case <-ticker.C: + case <-ticker.Read(): writeOpenDNSRequestsToDB() } } diff --git a/process/database.go b/process/database.go index 4def9b01..8ddffa14 100644 --- a/process/database.go +++ b/process/database.go @@ -53,9 +53,13 @@ func (p *Process) Save() { p.UpdateMeta() + if p.processKey == "" { + p.processKey = getProcessKey(int32(p.Pid), p.CreatedAt) + } + if !p.KeyIsSet() { // set key - p.SetKey(fmt.Sprintf("%s/%s", processDatabaseNamespace, getProcessKey(int32(p.Pid), p.CreatedAt))) + p.SetKey(fmt.Sprintf("%s/%s", processDatabaseNamespace, p.processKey)) // save processesLock.Lock()