Skip to main content

compio_runtime\fd\poll_fd/
mod.rs

1cfg_if::cfg_if! {
2    if #[cfg(windows)] {
3        #[path = "windows.rs"]
4        mod sys;
5    } else if #[cfg(unix)] {
6        #[path = "unix.rs"]
7        mod sys;
8    }
9}
10
11#[cfg(windows)]
12use std::os::windows::io::{AsRawSocket, RawSocket};
13use std::{io, ops::Deref};
14
15use compio_buf::IntoInner;
16use compio_driver::{AsFd, AsRawFd, BorrowedFd, RawFd, SharedFd, ToSharedFd};
17
18/// Providing functionalities to wait for readiness.
19#[derive(Debug)]
20pub struct PollFd<T: AsFd>(sys::PollFd<T>);
21
22impl<T: AsFd> PollFd<T> {
23    /// Create [`PollFd`] without attaching the source.
24    ///
25    /// Ready-based sources does not need to be attached.
26    pub fn new(source: T) -> io::Result<Self> {
27        Self::from_shared_fd(SharedFd::new(source))
28    }
29
30    /// Create [`PollFd`] from a shared file descriptor.
31    pub fn from_shared_fd(inner: SharedFd<T>) -> io::Result<Self> {
32        Ok(Self(sys::PollFd::new(inner)?))
33    }
34}
35
36impl<T: AsFd + 'static> PollFd<T> {
37    /// Wait for accept readiness, before calling `accept`, or after `accept`
38    /// returns `WouldBlock`.
39    pub async fn accept_ready(&self) -> io::Result<()> {
40        self.0.accept_ready().await
41    }
42
43    /// Wait for connect readiness.
44    pub async fn connect_ready(&self) -> io::Result<()> {
45        self.0.connect_ready().await
46    }
47
48    /// Wait for read readiness.
49    pub async fn read_ready(&self) -> io::Result<()> {
50        self.0.read_ready().await
51    }
52
53    /// Wait for write readiness.
54    pub async fn write_ready(&self) -> io::Result<()> {
55        self.0.write_ready().await
56    }
57}
58
59impl<T: AsFd> IntoInner for PollFd<T> {
60    type Inner = SharedFd<T>;
61
62    fn into_inner(self) -> Self::Inner {
63        self.0.into_inner()
64    }
65}
66
67impl<T: AsFd> ToSharedFd<T> for PollFd<T> {
68    fn to_shared_fd(&self) -> SharedFd<T> {
69        self.0.to_shared_fd()
70    }
71}
72
73impl<T: AsFd> AsFd for PollFd<T> {
74    fn as_fd(&self) -> BorrowedFd<'_> {
75        self.0.as_fd()
76    }
77}
78
79impl<T: AsFd> AsRawFd for PollFd<T> {
80    fn as_raw_fd(&self) -> RawFd {
81        self.0.as_raw_fd()
82    }
83}
84
85#[cfg(windows)]
86impl<T: AsFd + AsRawSocket> AsRawSocket for PollFd<T> {
87    fn as_raw_socket(&self) -> RawSocket {
88        self.0.as_raw_socket()
89    }
90}
91
92impl<T: AsFd> Deref for PollFd<T> {
93    type Target = T;
94
95    fn deref(&self) -> &Self::Target {
96        &self.0
97    }
98}