aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/service
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2019-04-30 14:01:42 +0200
committerJason A. Donenfeld <Jason@zx2c4.com>2019-04-30 20:19:50 +0200
commit508d45a6f7195970d0bc68a1223a3282ce666010 (patch)
tree456e11464978e66542d98def6b8e1374bbec34d8 /service
parentui: pick more windowsy colors (diff)
downloadwireguard-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.go19
-rw-r--r--service/ipc_server.go5
-rw-r--r--service/service_manager.go6
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()
}