aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--conf/storewatcher.go34
-rw-r--r--conf/storewatcher_windows.go4
-rw-r--r--service/ipc_server.go4
-rw-r--r--service/service_manager.go3
4 files changed, 19 insertions, 26 deletions
diff --git a/conf/storewatcher.go b/conf/storewatcher.go
index 4f9c2ef7..7a5ab387 100644
--- a/conf/storewatcher.go
+++ b/conf/storewatcher.go
@@ -5,34 +5,20 @@
package conf
-import "reflect"
-
-type StoreCallback func()
+type storeCallback struct {
+ cb func()
+}
-var storeCallbacks []StoreCallback
+var storeCallbacks = make(map[*storeCallback]bool)
-func RegisterStoreChangeCallback(cb StoreCallback) {
+func RegisterStoreChangeCallback(cb func()) *storeCallback {
startWatchingConfigDir()
cb()
- storeCallbacks = append(storeCallbacks, cb)
+ s := &storeCallback{cb}
+ storeCallbacks[s] = true
+ return s
}
-func UnregisterStoreChangeCallback(cb StoreCallback) {
- //TODO: this function is ridiculous, doing slow iteration like this and reflection too.
-
- index := -1
- for i, e := range storeCallbacks {
- if reflect.ValueOf(e).Pointer() == reflect.ValueOf(cb).Pointer() {
- index = i
- break
- }
- }
- if index == -1 {
- return
- }
- newList := storeCallbacks[0:index]
- if index < len(storeCallbacks)-1 {
- newList = append(newList, storeCallbacks[index+1:]...)
- }
- storeCallbacks = newList
+func UnregisterStoreChangeCallback(cb *storeCallback) {
+ delete(storeCallbacks, cb)
}
diff --git a/conf/storewatcher_windows.go b/conf/storewatcher_windows.go
index f3f38fef..ddfc8b92 100644
--- a/conf/storewatcher_windows.go
+++ b/conf/storewatcher_windows.go
@@ -46,8 +46,8 @@ func startWatchingConfigDir() {
log.Fatalf("Unable to wait on config directory watcher: %v", err)
}
- for _, cb := range storeCallbacks {
- cb()
+ for cb := range storeCallbacks {
+ cb.cb()
}
err = findNextChangeNotification(h)
diff --git a/service/ipc_server.go b/service/ipc_server.go
index 73c2916e..4388bb00 100644
--- a/service/ipc_server.go
+++ b/service/ipc_server.go
@@ -151,6 +151,10 @@ func IPCServerListen(reader *os.File, writer *os.File, events *os.File) error {
}
func notifyAll(notificationType NotificationType, iface interface{}) {
+ if len(managerServices) == 0 {
+ return
+ }
+
var buf bytes.Buffer
encoder := gob.NewEncoder(&buf)
err := encoder.Encode(notificationType)
diff --git a/service/service_manager.go b/service/service_manager.go
index eb28e833..6b4a9b90 100644
--- a/service/service_manager.go
+++ b/service/service_manager.go
@@ -9,6 +9,7 @@ import (
"golang.org/x/sys/windows"
"golang.org/x/sys/windows/svc"
"golang.org/x/sys/windows/svc/eventlog"
+ "golang.zx2c4.com/wireguard/windows/conf"
"log"
"os"
"strconv"
@@ -128,6 +129,8 @@ func (service *managerService) Execute(args []string, r <-chan svc.ChangeRequest
return
}
+ conf.RegisterStoreChangeCallback(IPCServerNotifyTunnelsChange)
+
procs := make(map[uint32]*os.Process)
procsLock := sync.Mutex{}
var startProcess func(session uint32)