132 lines
3.6 KiB
Rust
132 lines
3.6 KiB
Rust
#![cfg_attr(not(feature = "net"), allow(dead_code, unreachable_pub))]
|
|
|
|
use crate::io::ready::Ready;
|
|
|
|
use std::fmt;
|
|
use std::ops;
|
|
|
|
/// Readiness event interest.
|
|
///
|
|
/// Specifies the readiness events the caller is interested in when awaiting on
|
|
/// I/O resource readiness states.
|
|
#[cfg_attr(docsrs, doc(cfg(feature = "net")))]
|
|
#[derive(Clone, Copy, Eq, PartialEq)]
|
|
pub struct Interest(mio::Interest);
|
|
|
|
impl Interest {
|
|
// The non-FreeBSD definitions in this block are active only when
|
|
// building documentation.
|
|
cfg_aio! {
|
|
/// Interest for POSIX AIO.
|
|
#[cfg(target_os = "freebsd")]
|
|
pub const AIO: Interest = Interest(mio::Interest::AIO);
|
|
|
|
/// Interest for POSIX AIO.
|
|
#[cfg(not(target_os = "freebsd"))]
|
|
pub const AIO: Interest = Interest(mio::Interest::READABLE);
|
|
|
|
/// Interest for POSIX AIO lio_listio events.
|
|
#[cfg(target_os = "freebsd")]
|
|
pub const LIO: Interest = Interest(mio::Interest::LIO);
|
|
|
|
/// Interest for POSIX AIO lio_listio events.
|
|
#[cfg(not(target_os = "freebsd"))]
|
|
pub const LIO: Interest = Interest(mio::Interest::READABLE);
|
|
}
|
|
|
|
/// Interest in all readable events.
|
|
///
|
|
/// Readable interest includes read-closed events.
|
|
pub const READABLE: Interest = Interest(mio::Interest::READABLE);
|
|
|
|
/// Interest in all writable events.
|
|
///
|
|
/// Writable interest includes write-closed events.
|
|
pub const WRITABLE: Interest = Interest(mio::Interest::WRITABLE);
|
|
|
|
/// Returns true if the value includes readable interest.
|
|
///
|
|
/// # Examples
|
|
///
|
|
/// ```
|
|
/// use tokio::io::Interest;
|
|
///
|
|
/// assert!(Interest::READABLE.is_readable());
|
|
/// assert!(!Interest::WRITABLE.is_readable());
|
|
///
|
|
/// let both = Interest::READABLE | Interest::WRITABLE;
|
|
/// assert!(both.is_readable());
|
|
/// ```
|
|
pub const fn is_readable(self) -> bool {
|
|
self.0.is_readable()
|
|
}
|
|
|
|
/// Returns true if the value includes writable interest.
|
|
///
|
|
/// # Examples
|
|
///
|
|
/// ```
|
|
/// use tokio::io::Interest;
|
|
///
|
|
/// assert!(!Interest::READABLE.is_writable());
|
|
/// assert!(Interest::WRITABLE.is_writable());
|
|
///
|
|
/// let both = Interest::READABLE | Interest::WRITABLE;
|
|
/// assert!(both.is_writable());
|
|
/// ```
|
|
pub const fn is_writable(self) -> bool {
|
|
self.0.is_writable()
|
|
}
|
|
|
|
/// Add together two `Interest` values.
|
|
///
|
|
/// This function works from a `const` context.
|
|
///
|
|
/// # Examples
|
|
///
|
|
/// ```
|
|
/// use tokio::io::Interest;
|
|
///
|
|
/// const BOTH: Interest = Interest::READABLE.add(Interest::WRITABLE);
|
|
///
|
|
/// assert!(BOTH.is_readable());
|
|
/// assert!(BOTH.is_writable());
|
|
pub const fn add(self, other: Interest) -> Interest {
|
|
Interest(self.0.add(other.0))
|
|
}
|
|
|
|
// This function must be crate-private to avoid exposing a `mio` dependency.
|
|
pub(crate) const fn to_mio(self) -> mio::Interest {
|
|
self.0
|
|
}
|
|
|
|
pub(crate) fn mask(self) -> Ready {
|
|
match self {
|
|
Interest::READABLE => Ready::READABLE | Ready::READ_CLOSED,
|
|
Interest::WRITABLE => Ready::WRITABLE | Ready::WRITE_CLOSED,
|
|
_ => Ready::EMPTY,
|
|
}
|
|
}
|
|
}
|
|
|
|
impl ops::BitOr for Interest {
|
|
type Output = Self;
|
|
|
|
#[inline]
|
|
fn bitor(self, other: Self) -> Self {
|
|
self.add(other)
|
|
}
|
|
}
|
|
|
|
impl ops::BitOrAssign for Interest {
|
|
#[inline]
|
|
fn bitor_assign(&mut self, other: Self) {
|
|
self.0 = (*self | other).0;
|
|
}
|
|
}
|
|
|
|
impl fmt::Debug for Interest {
|
|
fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
self.0.fmt(fmt)
|
|
}
|
|
}
|