mirror of
https://github.com/tokio-rs/tokio.git
synced 2025-10-01 12:20:39 +00:00
io: improve AsyncFd example (#5481)
This commit is contained in:
parent
ee09e04c31
commit
018d0450c7
@ -65,8 +65,8 @@ use std::{task::Context, task::Poll};
|
|||||||
/// # Examples
|
/// # Examples
|
||||||
///
|
///
|
||||||
/// This example shows how to turn [`std::net::TcpStream`] asynchronous using
|
/// This example shows how to turn [`std::net::TcpStream`] asynchronous using
|
||||||
/// `AsyncFd`. It implements `read` as an async fn, and `AsyncWrite` as a trait
|
/// `AsyncFd`. It implements the read/write operations both as an `async fn`
|
||||||
/// to show how to implement both approaches.
|
/// and using the IO traits [`AsyncRead`] and [`AsyncWrite`].
|
||||||
///
|
///
|
||||||
/// ```no_run
|
/// ```no_run
|
||||||
/// use futures::ready;
|
/// use futures::ready;
|
||||||
@ -74,7 +74,7 @@ use std::{task::Context, task::Poll};
|
|||||||
/// use std::net::TcpStream;
|
/// use std::net::TcpStream;
|
||||||
/// use std::pin::Pin;
|
/// use std::pin::Pin;
|
||||||
/// use std::task::{Context, Poll};
|
/// use std::task::{Context, Poll};
|
||||||
/// use tokio::io::AsyncWrite;
|
/// use tokio::io::{AsyncRead, AsyncWrite, ReadBuf};
|
||||||
/// use tokio::io::unix::AsyncFd;
|
/// use tokio::io::unix::AsyncFd;
|
||||||
///
|
///
|
||||||
/// pub struct AsyncTcpStream {
|
/// pub struct AsyncTcpStream {
|
||||||
@ -99,6 +99,39 @@ use std::{task::Context, task::Poll};
|
|||||||
/// }
|
/// }
|
||||||
/// }
|
/// }
|
||||||
/// }
|
/// }
|
||||||
|
///
|
||||||
|
/// pub async fn write(&self, buf: &[u8]) -> io::Result<usize> {
|
||||||
|
/// loop {
|
||||||
|
/// let mut guard = self.inner.writable().await?;
|
||||||
|
///
|
||||||
|
/// match guard.try_io(|inner| inner.get_ref().write(buf)) {
|
||||||
|
/// Ok(result) => return result,
|
||||||
|
/// Err(_would_block) => continue,
|
||||||
|
/// }
|
||||||
|
/// }
|
||||||
|
/// }
|
||||||
|
/// }
|
||||||
|
///
|
||||||
|
/// impl AsyncRead for AsyncTcpStream {
|
||||||
|
/// fn poll_read(
|
||||||
|
/// self: Pin<&mut Self>,
|
||||||
|
/// cx: &mut Context<'_>,
|
||||||
|
/// buf: &mut ReadBuf<'_>
|
||||||
|
/// ) -> Poll<io::Result<()>> {
|
||||||
|
/// loop {
|
||||||
|
/// let mut guard = ready!(self.inner.poll_read_ready(cx))?;
|
||||||
|
///
|
||||||
|
/// let unfilled = buf.initialize_unfilled();
|
||||||
|
/// match guard.try_io(|inner| inner.get_ref().read(unfilled)) {
|
||||||
|
/// Ok(Ok(len)) => {
|
||||||
|
/// buf.advance(len);
|
||||||
|
/// return Poll::Ready(Ok(()));
|
||||||
|
/// },
|
||||||
|
/// Ok(Err(err)) => return Poll::Ready(Err(err)),
|
||||||
|
/// Err(_would_block) => continue,
|
||||||
|
/// }
|
||||||
|
/// }
|
||||||
|
/// }
|
||||||
/// }
|
/// }
|
||||||
///
|
///
|
||||||
/// impl AsyncWrite for AsyncTcpStream {
|
/// impl AsyncWrite for AsyncTcpStream {
|
||||||
@ -139,6 +172,8 @@ use std::{task::Context, task::Poll};
|
|||||||
/// [`writable`]: method@Self::writable
|
/// [`writable`]: method@Self::writable
|
||||||
/// [`AsyncFdReadyGuard`]: struct@self::AsyncFdReadyGuard
|
/// [`AsyncFdReadyGuard`]: struct@self::AsyncFdReadyGuard
|
||||||
/// [`TcpStream::poll_read_ready`]: struct@crate::net::TcpStream
|
/// [`TcpStream::poll_read_ready`]: struct@crate::net::TcpStream
|
||||||
|
/// [`AsyncRead`]: trait@crate::io::AsyncRead
|
||||||
|
/// [`AsyncWrite`]: trait@crate::io::AsyncWrite
|
||||||
pub struct AsyncFd<T: AsRawFd> {
|
pub struct AsyncFd<T: AsRawFd> {
|
||||||
registration: Registration,
|
registration: Registration,
|
||||||
inner: Option<T>,
|
inner: Option<T>,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user