compio_net/poll_fd/
unix.rs

1use std::{io, ops::Deref};
2
3use compio_buf::{BufResult, IntoInner};
4use compio_driver::{
5    AsFd, AsRawFd, BorrowedFd, RawFd, SharedFd, ToSharedFd,
6    op::{Interest, PollOnce},
7};
8
9#[derive(Debug)]
10pub struct PollFd<T: AsFd> {
11    inner: SharedFd<T>,
12}
13
14impl<T: AsFd> PollFd<T> {
15    pub fn new(inner: SharedFd<T>) -> io::Result<Self> {
16        Ok(Self { inner })
17    }
18}
19
20impl<T: AsFd + 'static> PollFd<T> {
21    pub async fn accept_ready(&self) -> io::Result<()> {
22        self.read_ready().await
23    }
24
25    pub async fn connect_ready(&self) -> io::Result<()> {
26        self.write_ready().await
27    }
28
29    pub async fn read_ready(&self) -> io::Result<()> {
30        let op = PollOnce::new(self.to_shared_fd(), Interest::Readable);
31        let BufResult(res, _) = compio_runtime::submit(op).await;
32        res?;
33        Ok(())
34    }
35
36    pub async fn write_ready(&self) -> io::Result<()> {
37        let op = PollOnce::new(self.to_shared_fd(), Interest::Writable);
38        let BufResult(res, _) = compio_runtime::submit(op).await;
39        res?;
40        Ok(())
41    }
42}
43
44impl<T: AsFd> IntoInner for PollFd<T> {
45    type Inner = SharedFd<T>;
46
47    fn into_inner(self) -> Self::Inner {
48        self.inner
49    }
50}
51
52impl<T: AsFd> ToSharedFd<T> for PollFd<T> {
53    fn to_shared_fd(&self) -> SharedFd<T> {
54        self.inner.clone()
55    }
56}
57
58impl<T: AsFd> AsFd for PollFd<T> {
59    fn as_fd(&self) -> BorrowedFd<'_> {
60        self.inner.as_fd()
61    }
62}
63
64impl<T: AsFd> AsRawFd for PollFd<T> {
65    fn as_raw_fd(&self) -> RawFd {
66        self.inner.as_fd().as_raw_fd()
67    }
68}
69
70impl<T: AsFd> Deref for PollFd<T> {
71    type Target = T;
72
73    fn deref(&self) -> &Self::Target {
74        &self.inner
75    }
76}