Spec-Zone.ru › Tokio

Структура AsyncFdReadyMutGuard

pub struct AsyncFdReadyMutGuard<'a, T: AsRawFd> { /* private fields */ }
Доступно только в Unix и при включённой функции crate 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_ref(&self) -> &AsyncFd<Inner>

Возвращает общую ссылку на внутренний объект AsyncFd.

pub fn get_mut(&mut self) -> &mut AsyncFd<Inner>

Возвращает изменяемую ссылку на внутренний AsyncFd.

pub fn get_inner(&self) -> &Inner

Возвращает общую ссылку на базовый объект внутреннего AsyncFd.

pub fn get_inner_mut(&mut self) -> &mut Inner

Возвращает изменяемую ссылку на базовый объект внутреннего AsyncFd.

Реализации трейтов

impl<'a, T: Debug + AsRawFd> Debug for AsyncFdReadyMutGuard<'a, T>

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Форматирует значение с помощью указанного форматировщика. Подробнее

Реализации автоматических трейтов

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> Any for T
where T: 'static + ?Sized,

fn type_id(&self) -> TypeId

Получает TypeId для self. Подробнее

impl<T> Borrow<T> for T
where T: ?Sized,

fn borrow(&self) -> &T

Неизменяемо заимствует принадлежащее значение. Подробнее

impl<T> BorrowMut<T> for T
where T: ?Sized,

fn borrow_mut(&mut self) -> &mut T

Изменяемо заимствует принадлежащее значение. Подробнее

impl<T> From<T> for T

fn from(t: T) -> T

Возвращает аргумент без изменений.

impl<T> Instrument for T

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Инструментирует этот тип с помощью предоставленного Span, возвращая обёртку Instrumented. Подробнее

fn in_current_span(self) -> Instrumented<Self> ⓘ

Инструментирует этот тип с помощью текущего Span, возвращая обёртку Instrumented. Подробнее

impl<T, U> Into<U> for T
where U: From<T>,

fn into(self) -> U

Вызывает U::from(self).

То есть это преобразование выполняет то, что выберет реализация From<T> for U.

impl<T, U> TryFrom<U> for T
where U: Into<T>,

type Error = Infallible

Тип, возвращаемый в случае ошибки преобразования.

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Выполняет преобразование.

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

type Error = <U as TryFrom<T>>::Error

Тип, возвращаемый в случае ошибки преобразования.

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Выполняет преобразование.

impl<T> WithSubscriber for T

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Присоединяет предоставленный Subscriber к этому типу и возвращает обёртку WithDispatch. Подробнее

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API