@@ -11,10 +11,10 @@ use crate::Result;
1111/// [`ppoll`](fn.ppoll.html) functions to specify the events of interest
1212/// for a specific file descriptor.
1313///
14- /// After a call to `poll` or `ppoll`, the events that occurred can be
15- /// retrieved by calling [`revents()`](#method.revents) on the `PollFd`.
14+ /// After a call to `poll` or `ppoll`, the events that occurred can be retrieved by calling
15+ /// [`revents()`](#method.revents) on the `PollFd` object from the array passed to `poll `.
1616#[ repr( transparent) ]
17- #[ derive( Clone , Copy , Debug , Eq , Hash , PartialEq ) ]
17+ #[ derive( Clone , Debug , Eq , Hash , PartialEq ) ]
1818pub struct PollFd < ' fd > {
1919 pollfd : libc:: pollfd ,
2020 _fd : std:: marker:: PhantomData < BorrowedFd < ' fd > > ,
@@ -33,11 +33,8 @@ impl<'fd> PollFd<'fd> {
3333 /// # };
3434 /// let (r, w) = pipe().unwrap();
3535 /// let pfd = PollFd::new(r.as_fd(), PollFlags::POLLIN);
36- /// let mut fds = [pfd];
37- /// poll(&mut fds, PollTimeout::NONE).unwrap();
38- /// let mut buf = [0u8; 80];
39- /// read(&r, &mut buf[..]);
4036 /// ```
37+ /// These are placed in an array and passed to [`poll`] or [`ppoll`](fn.ppoll.html).
4138 // Unlike I/O functions, constructors like this must take `BorrowedFd`
4239 // instead of AsFd or &AsFd. Otherwise, an `OwnedFd` argument would be
4340 // dropped at the end of the method, leaving the structure referencing a
@@ -61,7 +58,7 @@ impl<'fd> PollFd<'fd> {
6158
6259 /// Returns the events that occurred in the last call to `poll` or `ppoll`. Will only return
6360 /// `None` if the kernel provides status flags that Nix does not know about.
64- pub fn revents ( self ) -> Option < PollFlags > {
61+ pub fn revents ( & self ) -> Option < PollFlags > {
6562 PollFlags :: from_bits ( self . pollfd . revents )
6663 }
6764
@@ -71,7 +68,7 @@ impl<'fd> PollFd<'fd> {
7168 /// Equivalent to `x.revents()? != PollFlags::empty()`.
7269 ///
7370 /// This is marginally more efficient than [`PollFd::all`].
74- pub fn any ( self ) -> Option < bool > {
71+ pub fn any ( & self ) -> Option < bool > {
7572 Some ( self . revents ( ) ? != PollFlags :: empty ( ) )
7673 }
7774
@@ -81,12 +78,12 @@ impl<'fd> PollFd<'fd> {
8178 /// Equivalent to `x.revents()? & x.events() == x.events()`.
8279 ///
8380 /// This is marginally less efficient than [`PollFd::any`].
84- pub fn all ( self ) -> Option < bool > {
81+ pub fn all ( & self ) -> Option < bool > {
8582 Some ( self . revents ( ) ? & self . events ( ) == self . events ( ) )
8683 }
8784
8885 /// The events of interest for this `PollFd`.
89- pub fn events ( self ) -> PollFlags {
86+ pub fn events ( & self ) -> PollFlags {
9087 PollFlags :: from_bits ( self . pollfd . events ) . unwrap ( )
9188 }
9289
@@ -196,6 +193,34 @@ libc_bitflags! {
196193/// in timeout means an infinite timeout. Specifying a timeout of
197194/// [`PollTimeout::ZERO`] causes `poll()` to return immediately, even if no file
198195/// descriptors are ready.
196+ ///
197+ /// The return value contains the number of `fds` which have selected events ([`PollFd::revents`]).
198+ ///
199+ /// # Examples
200+ /// ```no_run
201+ /// # use std::os::unix::io::{AsFd, AsRawFd, FromRawFd};
202+ /// # use nix::{
203+ /// # poll::{PollTimeout, PollFd, PollFlags, poll},
204+ /// # unistd::{pipe, read}
205+ /// # };
206+ /// let (r0, w0) = pipe().unwrap();
207+ /// let (r1, w1) = pipe().unwrap();
208+ ///
209+ /// let mut pollfds = [
210+ /// PollFd::new(r0.as_fd(), PollFlags::POLLIN),
211+ /// PollFd::new(r1.as_fd(), PollFlags::POLLIN),
212+ /// ];
213+ ///
214+ /// let nready = poll(&mut pollfds, PollTimeout::NONE).unwrap();
215+ /// assert!(nready >= 1); // Since there is no timeout
216+ ///
217+ /// let mut buf = [0u8; 80];
218+ /// if pollfds[0].any().unwrap_or_default() {
219+ /// read(&r0, &mut buf[..]);
220+ /// } else if pollfds[1].any().unwrap_or_default() {
221+ /// read(&r1, &mut buf[..]);
222+ /// }
223+ /// ```
199224pub fn poll < T : Into < PollTimeout > > (
200225 fds : & mut [ PollFd ] ,
201226 timeout : T ,
@@ -217,7 +242,7 @@ feature! {
217242/// descriptor becomes ready or until a signal is caught.
218243/// ([`poll(2)`](https://man7.org/linux/man-pages/man2/poll.2.html))
219244///
220- /// `ppoll` behaves like `poll`, but let you specify what signals may interrupt it
245+ /// `ppoll` behaves like [ `poll`] , but let you specify what signals may interrupt it
221246/// with the `sigmask` argument. If you want `ppoll` to block indefinitely,
222247/// specify `None` as `timeout` (it is like `timeout = -1` for `poll`).
223248/// If `sigmask` is `None`, then no signal mask manipulation is performed,
0 commit comments