aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/service/tunneltracker.go
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2019-04-26 20:05:24 +0200
committerJason A. Donenfeld <Jason@zx2c4.com>2019-04-27 08:24:22 +0200
commit3e8cf39903775ecb6b8ebe03d43591453fe3c7d8 (patch)
treed62408b62529d0e18a19866d540c1c87cfa957c1 /service/tunneltracker.go
parentinstaller: new checksums for working msm (diff)
downloadwireguard-windows-3e8cf39903775ecb6b8ebe03d43591453fe3c7d8.tar.xz
wireguard-windows-3e8cf39903775ecb6b8ebe03d43591453fe3c7d8.zip
ui: simplify everything
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Diffstat (limited to '')
-rw-r--r--service/tunneltracker.go35
1 files changed, 30 insertions, 5 deletions
diff --git a/service/tunneltracker.go b/service/tunneltracker.go
index 3cf9fde5..cfc894f4 100644
--- a/service/tunneltracker.go
+++ b/service/tunneltracker.go
@@ -85,7 +85,7 @@ var serviceTrackerCallbackPtr = windows.NewCallback(func(notifier *serviceNotify
return 0
})
-var trackedTunnels = make(map[string]bool)
+var trackedTunnels = make(map[string]TunnelState)
var trackedTunnelsLock = sync.Mutex{}
func svcStateToTunState(s svc.State) TunnelState {
@@ -103,16 +103,32 @@ func svcStateToTunState(s svc.State) TunnelState {
}
}
+func trackedTunnelsGlobalState() (state TunnelState) {
+ state = TunnelStopped
+ trackedTunnelsLock.Lock()
+ defer trackedTunnelsLock.Unlock()
+ for _, s := range trackedTunnels {
+ if s == TunnelStarting {
+ return TunnelStarting
+ } else if s == TunnelStopping {
+ return TunnelStopping
+ } else if s == TunnelStarted || s == TunnelUnknown {
+ state = TunnelStarted
+ }
+ }
+ return
+}
+
func trackTunnelService(tunnelName string, service *mgr.Service) {
defer service.Close()
trackedTunnelsLock.Lock()
- _, isTracked := trackedTunnels[tunnelName]
- trackedTunnels[tunnelName] = true
- trackedTunnelsLock.Unlock()
- if isTracked {
+ if _, found := trackedTunnels[tunnelName]; found {
+ trackedTunnelsLock.Unlock()
return
}
+ trackedTunnels[tunnelName] = TunnelUnknown
+ trackedTunnelsLock.Unlock()
defer func() {
trackedTunnelsLock.Lock()
delete(trackedTunnels, tunnelName)
@@ -133,11 +149,17 @@ func trackTunnelService(tunnelName string, service *mgr.Service) {
case 0:
sleepEx(windows.INFINITE, true)
case errorServiceMARKED_FOR_DELETE:
+ trackedTunnelsLock.Lock()
+ trackedTunnels[tunnelName] = TunnelStopped
+ trackedTunnelsLock.Unlock()
IPCServerNotifyTunnelChange(tunnelName, TunnelStopped, nil)
return
case errorServiceNOTIFY_CLIENT_LAGGING:
continue
default:
+ trackedTunnelsLock.Lock()
+ trackedTunnels[tunnelName] = TunnelStopped
+ trackedTunnelsLock.Unlock()
IPCServerNotifyTunnelChange(tunnelName, TunnelStopped, fmt.Errorf("Unable to continue monitoring service, so stopping: %v", syscall.Errno(ret)))
service.Control(svc.Stop)
return
@@ -160,6 +182,9 @@ func trackTunnelService(tunnelName string, service *mgr.Service) {
}
}
if state != lastState {
+ trackedTunnelsLock.Lock()
+ trackedTunnels[tunnelName] = state
+ trackedTunnelsLock.Unlock()
IPCServerNotifyTunnelChange(tunnelName, state, tunnelError)
lastState = state
}