From 25fe7d13d91a4227f67bddf1b6aeabf842bd611c Mon Sep 17 00:00:00 2001 From: Viktor Liu Date: Fri, 17 Jul 2026 12:51:43 +0200 Subject: [PATCH] Keep Windows power notification handle when unregister fails --- client/internal/sleep/detector_windows.go | 26 ++++++++++++++--------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/client/internal/sleep/detector_windows.go b/client/internal/sleep/detector_windows.go index 1a16aeeb9..9d2dbb9bc 100644 --- a/client/internal/sleep/detector_windows.go +++ b/client/internal/sleep/detector_windows.go @@ -148,23 +148,29 @@ func (d *Detector) Deregister() error { registryMu.Unlock() return nil } - close(d.done) - delete(registry, d.handle) + handle := d.handle hPowerNotify := d.hPowerNotify - d.handle = 0 - d.hPowerNotify = 0 + done := d.done registryMu.Unlock() log.Info("sleep detection service stopping (deregister)") - if hPowerNotify == 0 { - return nil + // Unregister the OS subscription first. If it fails, leave handle and + // hPowerNotify intact so a later call can retry the cleanup. + if hPowerNotify != 0 { + ret, _, callErr := unregisterSuspendResumeNotification.Call(hPowerNotify) + if ret == 0 { + return fmt.Errorf("UnregisterSuspendResumeNotification failed: %w", callErr) + } } - ret, _, callErr := unregisterSuspendResumeNotification.Call(hPowerNotify) - if ret == 0 { - return fmt.Errorf("UnregisterSuspendResumeNotification failed: %w", callErr) - } + registryMu.Lock() + close(done) + delete(registry, handle) + d.handle = 0 + d.hPowerNotify = 0 + registryMu.Unlock() + return nil }