diff options
author | Jason A. Donenfeld <Jason@zx2c4.com> | 2019-09-26 18:49:50 +0200 |
---|---|---|
committer | Jason A. Donenfeld <Jason@zx2c4.com> | 2019-09-27 10:44:35 +0200 |
commit | 9d8a4ae5a815d4c1e56d2b53ad64d9f97ebc7784 (patch) | |
tree | 820d4aade6836c251f131f0256c58e95334f124d /tunnel/winipcfg/interface_change_handler.go | |
parent | winipcfg: ensure we're passing copy to go routines (diff) | |
download | wireguard-windows-9d8a4ae5a815d4c1e56d2b53ad64d9f97ebc7784.tar.xz wireguard-windows-9d8a4ae5a815d4c1e56d2b53ad64d9f97ebc7784.zip |
winipcfg: port more granular locking from route change to others
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Diffstat (limited to 'tunnel/winipcfg/interface_change_handler.go')
-rw-r--r-- | tunnel/winipcfg/interface_change_handler.go | 27 |
1 files changed, 17 insertions, 10 deletions
diff --git a/tunnel/winipcfg/interface_change_handler.go b/tunnel/winipcfg/interface_change_handler.go index 57041719..6af5ea3c 100644 --- a/tunnel/winipcfg/interface_change_handler.go +++ b/tunnel/winipcfg/interface_change_handler.go @@ -17,42 +17,49 @@ type InterfaceChangeCallback struct { } var ( - interfaceChangeMutex = sync.Mutex{} - interfaceChangeCallbacks = make(map[*InterfaceChangeCallback]bool) - interfaceChangeHandle = windows.Handle(0) + interfaceChangeAddRemoveMutex = sync.Mutex{} + interfaceChangeMutex = sync.Mutex{} + interfaceChangeCallbacks = make(map[*InterfaceChangeCallback]bool) + interfaceChangeHandle = windows.Handle(0) ) // RegisterInterfaceChangeCallback registers a new InterfaceChangeCallback. If this particular callback is already // registered, the function will silently return. Returned InterfaceChangeCallback.Unregister method should be used // to unregister. func RegisterInterfaceChangeCallback(callback func(notificationType MibNotificationType, iface *MibIPInterfaceRow)) (*InterfaceChangeCallback, error) { - cb := &InterfaceChangeCallback{callback} + s := &InterfaceChangeCallback{callback} + + interfaceChangeAddRemoveMutex.Lock() + defer interfaceChangeAddRemoveMutex.Unlock() interfaceChangeMutex.Lock() defer interfaceChangeMutex.Unlock() - interfaceChangeCallbacks[cb] = true + interfaceChangeCallbacks[s] = true if interfaceChangeHandle == 0 { err := notifyIPInterfaceChange(windows.AF_UNSPEC, windows.NewCallback(interfaceChanged), 0, false, &interfaceChangeHandle) if err != nil { - delete(interfaceChangeCallbacks, cb) + delete(interfaceChangeCallbacks, s) interfaceChangeHandle = 0 return nil, err } } - return cb, nil + return s, nil } // Unregister unregisters the callback. func (callback *InterfaceChangeCallback) Unregister() error { - interfaceChangeMutex.Lock() - defer interfaceChangeMutex.Unlock() + interfaceChangeAddRemoveMutex.Lock() + defer interfaceChangeAddRemoveMutex.Unlock() + interfaceChangeMutex.Lock() delete(interfaceChangeCallbacks, callback) + removeIt := len(interfaceChangeCallbacks) == 0 && interfaceChangeHandle != 0 + interfaceChangeMutex.Unlock() - if len(interfaceChangeCallbacks) < 1 && interfaceChangeHandle != 0 { + if removeIt { err := cancelMibChangeNotify2(interfaceChangeHandle) if err != nil { return err |