diff options
-rw-r--r-- | conf/storewatcher.go | 34 | ||||
-rw-r--r-- | conf/storewatcher_windows.go | 4 | ||||
-rw-r--r-- | service/ipc_server.go | 4 | ||||
-rw-r--r-- | service/service_manager.go | 3 |
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) |