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