aboutsummaryrefslogtreecommitdiff
path: root/src/sys/windows/handle.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/sys/windows/handle.rs')
-rw-r--r--src/sys/windows/handle.rs30
1 files changed, 30 insertions, 0 deletions
diff --git a/src/sys/windows/handle.rs b/src/sys/windows/handle.rs
new file mode 100644
index 0000000..5b9ac0b
--- /dev/null
+++ b/src/sys/windows/handle.rs
@@ -0,0 +1,30 @@
+use std::os::windows::io::RawHandle;
+use windows_sys::Win32::Foundation::{CloseHandle, HANDLE};
+
+/// Wrapper around a Windows HANDLE so that we close it upon drop in all scenarios
+#[derive(Debug)]
+pub struct Handle(HANDLE);
+
+impl Handle {
+ #[inline]
+ pub fn new(handle: HANDLE) -> Self {
+ Self(handle)
+ }
+
+ pub fn raw(&self) -> HANDLE {
+ self.0
+ }
+
+ pub fn into_raw(self) -> RawHandle {
+ let ret = self.0;
+ // This is super important so that drop is not called!
+ std::mem::forget(self);
+ ret as RawHandle
+ }
+}
+
+impl Drop for Handle {
+ fn drop(&mut self) {
+ unsafe { CloseHandle(self.0) };
+ }
+}