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::io;
15 use std::sync::Arc;
16 
17 use crate::sys::windows::iocp::CompletionPort;
18 use crate::{Selector, Token};
19 
20 #[derive(Debug)]
21 pub(crate) struct WakerInner {
22     token: Token,
23     completion_port: Arc<CompletionPort>,
24 }
25 
26 impl WakerInner {
27     /// Creates a new WakerInner.
new(selector: &Selector, token: Token) -> io::Result<WakerInner>28     pub(crate) fn new(selector: &Selector, token: Token) -> io::Result<WakerInner> {
29         Ok(WakerInner {
30             token,
31             completion_port: selector.clone_cp(),
32         })
33     }
34 
35     /// Waker allows cross-thread waking of Poll.
wake(&self) -> io::Result<()>36     pub(crate) fn wake(&self) -> io::Result<()> {
37         self.completion_port.post(self.token)
38     }
39 }
40