Структура Async FdReady MutGuard
pub struct AsyncFdReadyMutGuard<'a, T: AsRawFd> { /* private fields */ }
net.Представляет событие готовности ввода-вывода, обнаруженное для определённого файлового дескриптора и ещё не подтверждённое. Эта структура must_use помогает не забыть явно сбросить событие (или оставить его без сброса).
Этот тип предоставляет изменяемую ссылку на базовый объект ввода-вывода.
Реализации
impl<'a, Inner: AsRawFd> AsyncFdReadyMutGuard<'a, Inner>
pub fn clear_ready(&mut self)
Сообщает tokio, что файловый дескриптор больше не готов. Все внутренние флаги готовности будут сброшены, и tokio будет ожидать следующего уведомления ОС о готовности по фронту.
Эта функция обычно используется с защитными объектами, возвращаемыми методами AsyncFd::readable_mut и AsyncFd::writable_mut.
Крайне важно не вызывать эту функцию, если ваш код действительно не обнаружил, что файловый дескриптор не готов. Не вызывайте её, например, просто потому, что чтение завершилось успешно; её следует вызывать, когда обнаружено, что чтение блокируется.
Этот метод сбрасывает только события готовности, произошедшие до создания данного защитного объекта. Иными словами, если ресурс ввода-вывода становится готовым между созданием защитного объекта и этим вызовом clear_ready, готовность фактически не сбрасывается.
pub fn clear_ready_matching(&mut self, ready: Ready)
Сообщает tokio, что файловый дескриптор больше не обладает определённой готовностью. Внутренний флаг готовности будет сброшен, и tokio будет ожидать следующего уведомления ОС о готовности по фронту.
Эта функция полезна в сочетании с методом AsyncFd::ready_mut, когда используется объединённый интерес, например Interest::READABLE | Interest::WRITABLE.
Крайне важно не вызывать эту функцию, если ваш код действительно не обнаружил, что файловый дескриптор не готов для переданного значения Ready. Не вызывайте её, например, просто потому, что чтение завершилось успешно; её следует вызывать, когда обнаружено, что чтение блокируется. Сбрасывайте только ту готовность, для которой обнаружена блокировка. Например, если при использовании объединённого интереса блокируется чтение, сбрасывайте только Ready::READABLE.
Этот метод сбрасывает только события готовности, произошедшие до создания данного защитного объекта. Иными словами, если ресурс ввода-вывода становится готовым между созданием защитного объекта и этим вызовом clear_ready_matching, готовность фактически не сбрасывается.
Примеры
Параллельное чтение и запись в std::net::TcpStream в рамках одной задачи без разделения.
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());
}
}
}
}
}pub fn retain_ready(&mut self)
Этот метод следует вызывать, когда вы намеренно хотите оставить флаг готовности установленным.
Хотя сама эта функция ничего не делает, она удовлетворяет ограничению #[must_use] для типа AsyncFdReadyGuard.
pub fn ready(&self) -> Ready
Возвращает значение Ready, связанное с этим защитным объектом.
Этот метод возвращает пустое состояние готовности, если для защитного объекта был вызван метод AsyncFdReadyGuard::clear_ready.
pub fn try_io<R>( &mut self, f: impl FnOnce(&mut AsyncFd<Inner>) -> Result<R>, ) -> Result<Result<R>, TryIoError>
Выполняет указанную операцию ввода-вывода.
Если f возвращает ошибку WouldBlock, состояние готовности, связанное с этим файловым дескриптором, сбрасывается, а метод возвращает Err(TryIoError::WouldBlock). В этом случае обычно потребуется снова опрашивать AsyncFd.
Этот метод помогает синхронизировать состояние готовности базового файлового дескриптора с состоянием готовности на стороне tokio: состояние на стороне tokio сбрасывается только при возникновении условия WouldBlock. Вызывающий код должен гарантировать, что f возвращает WouldBlock только в том случае, если файловый дескриптор, из которого получен этот AsyncFdReadyGuard, больше не отражает состояние готовности, запрошенное для создания этого AsyncFdReadyGuard.
pub fn get_mut(&mut self) -> &mut AsyncFd<Inner>
Возвращает изменяемую ссылку на внутренний AsyncFd.
pub fn get_inner_mut(&mut self) -> &mut Inner
Возвращает изменяемую ссылку на базовый объект внутреннего AsyncFd.
Реализации трейтов
Реализации автоматических трейтов
impl<'a, T> !RefUnwindSafe for AsyncFdReadyMutGuard<'a, T>
impl<'a, T> !UnwindSafe for AsyncFdReadyMutGuard<'a, T>
impl<'a, T> Freeze for AsyncFdReadyMutGuard<'a, T>
impl<'a, T> Send for AsyncFdReadyMutGuard<'a, T>where T: Send,
impl<'a, T> Sync for AsyncFdReadyMutGuard<'a, T>where T: Sync,
impl<'a, T> Unpin for AsyncFdReadyMutGuard<'a, T>
impl<'a, T> UnsafeUnpin for AsyncFdReadyMutGuard<'a, T>
Обобщённые реализации
impl<T> BorrowMut<T> for Twhere T: ?Sized,
fn borrow_mut(&mut self) -> &mut T
impl<T> Instrument for T
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
impl<T> WithSubscriber for T
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ
Subscriber к этому типу и возвращает обёртку WithDispatch. Подробнее
MIT License
Copyright © Tokio Contributors
https://docs.rs/tokio/1.53.1/tokio/io/unix/struct.AsyncFdReadyMutGuard.html