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 16 use crate::sys::WakerInner; 17 use crate::{Poll, Token}; 18 19 /// Waker allows cross-thread waking of Poll. 20 #[derive(Debug)] 21 pub struct Waker { 22 inner: WakerInner, 23 } 24 25 impl Waker { 26 /// Creates a new Waker new(poll: &Poll, token: Token) -> io::Result<Self>27 pub fn new(poll: &Poll, token: Token) -> io::Result<Self> { 28 WakerInner::new(poll.selector(), token).map(|inner| Waker { inner }) 29 } 30 /// Wakes up the [`Poll`] associated with this `Waker` wake(&self) -> io::Result<()>31 pub fn wake(&self) -> io::Result<()> { 32 self.inner.wake() 33 } 34 } 35 36 #[cfg(test)] 37 mod test { 38 /// UT cases for debug info of waker 39 /// 40 /// # Brief 41 /// 1. Create a Waker 42 /// 2. Check its fmt debug info 43 #[test] 44 #[cfg(target_os = "linux")] ut_waker_debug_info()45 fn ut_waker_debug_info() { 46 use crate::{Poll, Token, Waker}; 47 48 let poll = Poll::new().unwrap(); 49 let waker = Waker::new(&poll, Token::from_usize(0)).unwrap(); 50 let fmt = format!("{:?}", waker); 51 assert!(fmt.contains("fd:")); 52 assert!(fmt.contains("read:")); 53 assert!(fmt.contains("write:")); 54 } 55 } 56