• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 use crate::{event, Interest, Registry, Token};
2 
3 use std::io;
4 use std::os::unix::io::RawFd;
5 
6 /// Adapter for [`RawFd`] providing an [`event::Source`] implementation.
7 ///
8 /// `SourceFd` enables registering any type with an FD with [`Poll`].
9 ///
10 /// While only implementations for TCP and UDP are provided, Mio supports
11 /// registering any FD that can be registered with the underlying OS selector.
12 /// `SourceFd` provides the necessary bridge.
13 ///
14 /// Note that `SourceFd` takes a `&RawFd`. This is because `SourceFd` **does
15 /// not** take ownership of the FD. Specifically, it will not manage any
16 /// lifecycle related operations, such as closing the FD on drop. It is expected
17 /// that the `SourceFd` is constructed right before a call to
18 /// [`Registry::register`]. See the examples for more detail.
19 ///
20 /// [`event::Source`]: ../event/trait.Source.html
21 /// [`Poll`]: ../struct.Poll.html
22 /// [`Registry::register`]: ../struct.Registry.html#method.register
23 ///
24 /// # Examples
25 ///
26 /// Basic usage.
27 ///
28 #[cfg_attr(
29     all(feature = "os-poll", feature = "net", feature = "os-ext"),
30     doc = "```"
31 )]
32 #[cfg_attr(
33     not(all(feature = "os-poll", feature = "net", feature = "os-ext")),
34     doc = "```ignore"
35 )]
36 /// # use std::error::Error;
37 /// # fn main() -> Result<(), Box<dyn Error>> {
38 /// use mio::{Interest, Poll, Token};
39 /// use mio::unix::SourceFd;
40 ///
41 /// use std::os::unix::io::AsRawFd;
42 /// use std::net::TcpListener;
43 ///
44 /// // Bind a std listener
45 /// let listener = TcpListener::bind("127.0.0.1:0")?;
46 ///
47 /// let poll = Poll::new()?;
48 ///
49 /// // Register the listener
50 /// poll.registry().register(
51 ///     &mut SourceFd(&listener.as_raw_fd()),
52 ///     Token(0),
53 ///     Interest::READABLE)?;
54 /// #     Ok(())
55 /// # }
56 /// ```
57 ///
58 /// Implementing [`event::Source`] for a custom type backed by a [`RawFd`].
59 ///
60 #[cfg_attr(all(feature = "os-poll", feature = "os-ext"), doc = "```")]
61 #[cfg_attr(not(all(feature = "os-poll", feature = "os-ext")), doc = "```ignore")]
62 /// use mio::{event, Interest, Registry, Token};
63 /// use mio::unix::SourceFd;
64 ///
65 /// use std::os::unix::io::RawFd;
66 /// use std::io;
67 ///
68 /// # #[allow(dead_code)]
69 /// pub struct MyIo {
70 ///     fd: RawFd,
71 /// }
72 ///
73 /// impl event::Source for MyIo {
74 ///     fn register(&mut self, registry: &Registry, token: Token, interests: Interest)
75 ///         -> io::Result<()>
76 ///     {
77 ///         SourceFd(&self.fd).register(registry, token, interests)
78 ///     }
79 ///
80 ///     fn reregister(&mut self, registry: &Registry, token: Token, interests: Interest)
81 ///         -> io::Result<()>
82 ///     {
83 ///         SourceFd(&self.fd).reregister(registry, token, interests)
84 ///     }
85 ///
86 ///     fn deregister(&mut self, registry: &Registry) -> io::Result<()> {
87 ///         SourceFd(&self.fd).deregister(registry)
88 ///     }
89 /// }
90 /// ```
91 #[derive(Debug)]
92 pub struct SourceFd<'a>(pub &'a RawFd);
93 
94 impl<'a> event::Source for SourceFd<'a> {
register( &mut self, registry: &Registry, token: Token, interests: Interest, ) -> io::Result<()>95     fn register(
96         &mut self,
97         registry: &Registry,
98         token: Token,
99         interests: Interest,
100     ) -> io::Result<()> {
101         registry.selector().register(*self.0, token, interests)
102     }
103 
reregister( &mut self, registry: &Registry, token: Token, interests: Interest, ) -> io::Result<()>104     fn reregister(
105         &mut self,
106         registry: &Registry,
107         token: Token,
108         interests: Interest,
109     ) -> io::Result<()> {
110         registry.selector().reregister(*self.0, token, interests)
111     }
112 
deregister(&mut self, registry: &Registry) -> io::Result<()>113     fn deregister(&mut self, registry: &Registry) -> io::Result<()> {
114         registry.selector().deregister(*self.0)
115     }
116 }
117