Struct AsyncFdReadyMutGuard
struct AsyncFdReadyMutGuard<'a, T: AsRawFd> { ... }
Represents an IO-ready event detected on a particular file descriptor that
has not yet been acknowledged. This is a must_use structure to help ensure
that you do not forget to explicitly clear (or not clear) the event.
This type exposes a mutable reference to the underlying IO object.
Implementations
impl<'a, Inner: AsRawFd> AsyncFdReadyMutGuard<'a, Inner>
fn clear_ready(self: &mut Self)Indicates to tokio that the file descriptor is no longer ready. All internal readiness flags will be cleared, and tokio will wait for the next edge-triggered readiness notification from the OS.
This function is commonly used with guards returned by
AsyncFd::readable_mutandAsyncFd::writable_mut.It is critical that this function not be called unless your code actually observes that the file descriptor is not ready. Do not call it simply because, for example, a read succeeded; it should be called when a read is observed to block.
This method only clears readiness events that happened before the creation of this guard. In other words, if the IO resource becomes ready between the creation of the guard and this call to
clear_ready, then the readiness is not actually cleared.fn clear_ready_matching(self: &mut Self, ready: Ready)Indicates to tokio that the file descriptor no longer has a specific readiness. The internal readiness flag will be cleared, and tokio will wait for the next edge-triggered readiness notification from the OS.
This function is useful in combination with the
AsyncFd::ready_mutmethod when a combined interest likeInterest::READABLE | Interest::WRITABLEis used.It is critical that this function not be called unless your code actually observes that the file descriptor is not ready for the provided
Ready. Do not call it simply because, for example, a read succeeded; it should be called when a read is observed to block. Only clear the specific readiness that is observed to block. For example when a read blocks when using a combined interest, only clearReady::READABLE.This method only clears readiness events that happened before the creation of this guard. In other words, if the IO resource becomes ready between the creation of the guard and this call to
clear_ready, then the readiness is not actually cleared.Examples
Concurrently read and write to a
std::net::TcpStreamon the same task without splitting.use std::error::Error; use std::io; use std::io::{Read, Write}; use std::net::TcpStream; use tokio::io::unix::AsyncFd; use tokio::io::{Interest, Ready}; #[tokio::main] async fn main() -> Result<(), Box<dyn Error>> { let stream = TcpStream::connect("127.0.0.1:8080")?; stream.set_nonblocking(true)?; let mut stream = AsyncFd::new(stream)?; loop { let mut guard = stream .ready_mut(Interest::READABLE | Interest::WRITABLE) .await?; if guard.ready().is_readable() { let mut data = vec![0; 1024]; // Try to read data, this may still fail with `WouldBlock` // if the readiness event is a false positive. match guard.get_inner_mut().read(&mut data) { Ok(n) => { println!("read {} bytes", n); } Err(ref e) if e.kind() == io::ErrorKind::WouldBlock => { // a read has blocked, but a write might still succeed. // clear only the read readiness. guard.clear_ready_matching(Ready::READABLE); continue; } Err(e) => { return Err(e.into()); } } } if guard.ready().is_writable() { // Try to write data, this may still fail with `WouldBlock` // if the readiness event is a false positive. match guard.get_inner_mut().write(b"hello world") { Ok(n) => { println!("write {} bytes", n); } Err(ref e) if e.kind() == io::ErrorKind::WouldBlock => { // a write has blocked, but a read might still succeed. // clear only the write readiness. guard.clear_ready_matching(Ready::WRITABLE); continue; } Err(e) => { return Err(e.into()); } } } } }fn retain_ready(self: &mut Self)This method should be invoked when you intentionally want to keep the ready flag asserted.
While this function is itself a no-op, it satisfies the
#[must_use]constraint on theAsyncFdReadyGuardtype.fn ready(self: &Self) -> ReadyGet the
Readyvalue associated with this guard.This method will return the empty readiness state if
AsyncFdReadyGuard::clear_readyhas been called on the guard.fn try_io<R, impl FnOnce(&mut AsyncFd<Inner>) -> io::Result<R>: FnOnce(&mut AsyncFd<Inner>) -> io::Result<R>>(self: &mut Self, f: impl FnOnce(&mut AsyncFd<Inner>) -> Result<R>) -> Result<Result<R>, TryIoError>Performs the provided IO operation.
If
freturns aWouldBlockerror, the readiness state associated with this file descriptor is cleared, and the method returnsErr(TryIoError::WouldBlock). You will typically need to poll theAsyncFdagain when this happens.This method helps ensure that the readiness state of the underlying file descriptor remains in sync with the tokio-side readiness state, by clearing the tokio-side state only when a
WouldBlockcondition occurs. It is the responsibility of the caller to ensure thatfreturnsWouldBlockonly if the file descriptor that originated thisAsyncFdReadyGuardno longer expresses the readiness state that was queried to create thisAsyncFdReadyGuard.fn get_ref(self: &Self) -> &AsyncFd<Inner>Returns a shared reference to the inner
AsyncFd.fn get_mut(self: &mut Self) -> &mut AsyncFd<Inner>Returns a mutable reference to the inner
AsyncFd.fn get_inner(self: &Self) -> &InnerReturns a shared reference to the backing object of the inner
AsyncFd.fn get_inner_mut(self: &mut Self) -> &mut InnerReturns a mutable reference to the backing object of the inner
AsyncFd.
impl<'a, T> Freeze for AsyncFdReadyMutGuard<'a, T>
impl<'a, T> RefUnwindSafe for AsyncFdReadyMutGuard<'a, T>
impl<'a, T> Send for AsyncFdReadyMutGuard<'a, T>
impl<'a, T> Sync for AsyncFdReadyMutGuard<'a, T>
impl<'a, T> Unpin for AsyncFdReadyMutGuard<'a, T>
impl<'a, T> UnsafeUnpin for AsyncFdReadyMutGuard<'a, T>
impl<'a, T> UnwindSafe for AsyncFdReadyMutGuard<'a, T>
impl<'a, T: std::fmt::Debug + AsRawFd> Debug for AsyncFdReadyMutGuard<'a, T>
fn fmt(self: &Self, f: &mut Formatter<'_>) -> Result
impl<T> Any for AsyncFdReadyMutGuard<'a, T>
fn type_id(self: &Self) -> TypeId
impl<T> Borrow for AsyncFdReadyMutGuard<'a, T>
fn borrow(self: &Self) -> &T
impl<T> BorrowMut for AsyncFdReadyMutGuard<'a, T>
fn borrow_mut(self: &mut Self) -> &mut T
impl<T> From for AsyncFdReadyMutGuard<'a, T>
fn from(t: T) -> TReturns the argument unchanged.
impl<T, U> Into for AsyncFdReadyMutGuard<'a, T>
fn into(self: Self) -> UCalls
U::from(self).That is, this conversion is whatever the implementation of
[From]<T> for Uchooses to do.
impl<T, U> TryFrom for AsyncFdReadyMutGuard<'a, T>
fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>
impl<T, U> TryInto for AsyncFdReadyMutGuard<'a, T>
fn try_into(self: Self) -> Result<U, <U as TryFrom<T>>::Error>