1 use std::io; 2 3 use crate::sys::Selector; 4 use crate::Token; 5 6 /// Waker backed by kqueue user space notifications (`EVFILT_USER`). 7 /// 8 /// The implementation is fairly simple, first the kqueue must be setup to 9 /// receive waker events this done by calling `Selector.setup_waker`. Next 10 /// we need access to kqueue, thus we need to duplicate the file descriptor. 11 /// Now waking is as simple as adding an event to the kqueue. 12 #[derive(Debug)] 13 pub(crate) struct Waker { 14 selector: Selector, 15 token: Token, 16 } 17 18 impl Waker { new(selector: &Selector, token: Token) -> io::Result<Waker>19 pub(crate) fn new(selector: &Selector, token: Token) -> io::Result<Waker> { 20 let selector = selector.try_clone()?; 21 selector.setup_waker(token)?; 22 Ok(Waker { selector, token }) 23 } 24 wake(&self) -> io::Result<()>25 pub(crate) fn wake(&self) -> io::Result<()> { 26 self.selector.wake(self.token) 27 } 28 } 29