diff options
author | Jason A. Donenfeld <Jason@zx2c4.com> | 2019-04-30 14:01:42 +0200 |
---|---|---|
committer | Jason A. Donenfeld <Jason@zx2c4.com> | 2019-04-30 20:19:50 +0200 |
commit | 508d45a6f7195970d0bc68a1223a3282ce666010 (patch) | |
tree | 456e11464978e66542d98def6b8e1374bbec34d8 /service | |
parent | ui: pick more windowsy colors (diff) | |
download | wireguard-windows-508d45a6f7195970d0bc68a1223a3282ce666010.tar.xz wireguard-windows-508d45a6f7195970d0bc68a1223a3282ce666010.zip |
service: inform UIs it is time to quit so they can kill tray
Diffstat (limited to 'service')
-rw-r--r-- | service/ipc_client.go | 19 | ||||
-rw-r--r-- | service/ipc_server.go | 5 | ||||
-rw-r--r-- | service/service_manager.go | 6 |
3 files changed, 30 insertions, 0 deletions
diff --git a/service/ipc_client.go b/service/ipc_client.go index a6241af2..41e71f22 100644 --- a/service/ipc_client.go +++ b/service/ipc_client.go @@ -32,6 +32,7 @@ type NotificationType int const ( TunnelChangeNotificationType NotificationType = iota TunnelsChangeNotificationType + ManagerStoppingNotificationType ) var rpcClient *rpc.Client @@ -48,6 +49,12 @@ type TunnelsChangeCallback struct { var tunnelsChangeCallbacks = make(map[*TunnelsChangeCallback]bool) +type ManagerStoppingCallback struct { + cb func() +} + +var managerStoppingCallbacks = make(map[*ManagerStoppingCallback]bool) + func InitializeIPCClient(reader *os.File, writer *os.File, events *os.File) { rpcClient = rpc.NewClient(&pipeRWC{reader, writer}) go func() { @@ -95,6 +102,10 @@ func InitializeIPCClient(reader *os.File, writer *os.File, events *os.File) { for cb := range tunnelsChangeCallbacks { cb.cb() } + case ManagerStoppingNotificationType: + for cb := range managerStoppingCallbacks { + cb.cb() + } } } }() @@ -181,3 +192,11 @@ func IPCClientRegisterTunnelsChange(cb func()) *TunnelsChangeCallback { func (cb *TunnelsChangeCallback) Unregister() { delete(tunnelsChangeCallbacks, cb) } +func IPCClientRegisterManagerStopping(cb func()) *ManagerStoppingCallback { + s := &ManagerStoppingCallback{cb} + managerStoppingCallbacks[s] = true + return s +} +func (cb *ManagerStoppingCallback) Unregister() { + delete(managerStoppingCallbacks, cb) +} diff --git a/service/ipc_server.go b/service/ipc_server.go index 835301b8..9ccea8ef 100644 --- a/service/ipc_server.go +++ b/service/ipc_server.go @@ -303,3 +303,8 @@ func IPCServerNotifyTunnelChange(name string, state TunnelState, err error) { func IPCServerNotifyTunnelsChange() { notifyAll(TunnelsChangeNotificationType) } + +func IPCServerNotifyManagerStopping() { + notifyAll(ManagerStoppingNotificationType) + time.Sleep(time.Millisecond * 200) +} diff --git a/service/service_manager.go b/service/service_manager.go index b3752d31..33729795 100644 --- a/service/service_manager.go +++ b/service/service_manager.go @@ -143,9 +143,13 @@ func (service *managerService) Execute(args []string, r <-chan svc.ChangeRequest procs := make(map[uint32]*os.Process) procsLock := sync.Mutex{} var startProcess func(session uint32) + stoppingManager := false startProcess = func(session uint32) { for { + if stoppingManager { + return + } var userToken windows.Token err := wtfQueryUserToken(session, &userToken) if err != nil { @@ -305,6 +309,8 @@ loop: changes <- svc.Status{State: svc.StopPending} procsLock.Lock() + stoppingManager = true + IPCServerNotifyManagerStopping() for _, proc := range procs { proc.Kill() } |