From 7df050eee5f095cdc9a1f9c0faa6ee8f933aff7f Mon Sep 17 00:00:00 2001 From: Tao Hu <73904+hut36@users.noreply.github.com> Date: Wed, 12 Nov 2025 08:17:17 +0800 Subject: [PATCH] fix: free handles after stop (Windows) Free handles after stop so that wen can do prevent_display_sleep after stop. --- nosleep-windows/src/lib.rs | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/nosleep-windows/src/lib.rs b/nosleep-windows/src/lib.rs index 2dd7ecb..03a983d 100644 --- a/nosleep-windows/src/lib.rs +++ b/nosleep-windows/src/lib.rs @@ -6,10 +6,10 @@ use nosleep_types::{NoSleepError, NoSleepTrait}; use windows::core::PWSTR; -use windows::Win32::Foundation::HANDLE; +use windows::Win32::Foundation::{CloseHandle, HANDLE}; use windows::Win32::System::Power::{ - PowerClearRequest, PowerCreateRequest, PowerRequestDisplayRequired, PowerRequestSystemRequired, - PowerSetRequest, POWER_REQUEST_TYPE, + PowerCreateRequest, PowerRequestDisplayRequired, PowerRequestSystemRequired, PowerSetRequest, + POWER_REQUEST_TYPE, }; use windows::Win32::System::Threading::{ POWER_REQUEST_CONTEXT_SIMPLE_STRING, REASON_CONTEXT, REASON_CONTEXT_0, @@ -117,24 +117,25 @@ impl NoSleepTrait for NoSleep { fn stop(&mut self) -> Result<(), NoSleepError> { if let Some(handle) = &self.no_sleep_handle { unsafe { - PowerClearRequest(handle.system_handle, PowerRequestSystemRequired).map_err( - |e| NoSleepError::StopLock { - reason: e.to_string(), - }, - )?; if let Some(display_handle) = handle.display_handle { - PowerClearRequest(display_handle, PowerRequestDisplayRequired).map_err( - |e| NoSleepError::StopLock { - reason: e.to_string(), - }, - )?; + let _ = CloseHandle(display_handle); } + + let _ = CloseHandle(handle.system_handle); } + + self.no_sleep_handle = None; } Ok(()) } } +impl Drop for NoSleep { + fn drop(&mut self) { + let _ = self.stop(); + } +} + #[cfg(test)] mod tests { use super::*; @@ -157,4 +158,12 @@ mod tests { nosleep.prevent_display_sleep().unwrap(); nosleep.stop().unwrap(); } + + #[test] + fn test_start_after_stop() { + let mut nosleep = NoSleep::new().unwrap(); + nosleep.prevent_display_sleep().unwrap(); + nosleep.stop().unwrap(); + nosleep.prevent_display_sleep().unwrap(); + } }