compio_net/poll_fd/
unix.rs1use 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}