1 // Copyright (c) 2023 Huawei Device Co., Ltd.
2 // Licensed under the Apache License, Version 2.0 (the "License");
3 // you may not use this file except in compliance with the License.
4 // You may obtain a copy of the License at
5 //
6 //     http://www.apache.org/licenses/LICENSE-2.0
7 //
8 // Unless required by applicable law or agreed to in writing, software
9 // distributed under the License is distributed on an "AS IS" BASIS,
10 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11 // See the License for the specific language governing permissions and
12 // limitations under the License.
13 
14 use std::os::windows::io::RawHandle;
15 
16 use crate::sys::winapi::{CloseHandle, HANDLE};
17 
18 /// Ensures that the handle can be closed correctly when it is not needed
19 #[derive(Debug)]
20 pub(crate) struct Handle(HANDLE);
21 
22 impl Handle {
new(handle: HANDLE) -> Self23     pub(crate) fn new(handle: HANDLE) -> Self {
24         Self(handle)
25     }
26 
raw(&self) -> HANDLE27     pub(crate) fn raw(&self) -> HANDLE {
28         self.0
29     }
30 
into_raw(self) -> RawHandle31     pub(crate) fn into_raw(self) -> RawHandle {
32         let ret = self.0;
33         // This is super important so that drop is not called!
34         std::mem::forget(self);
35         ret as RawHandle
36     }
37 }
38 
39 impl Drop for Handle {
drop(&mut self)40     fn drop(&mut self) {
41         unsafe { CloseHandle(self.0) };
42     }
43 }
44