blob: 096de9f1d043458b3525a63865da9e48439b31c6 [file] [log] [blame]
use {Poll, Token};
use std::{fmt, io, ops};
/// A value that may be registered with `Poll`
///
/// Values that implement `Evented` can be registered with `Poll`. Users of Mio
/// should not use the `Evented` trait functions directly. Instead, the
/// equivalent functions on `Poll` should be used.
///
/// See [`Poll`] for more details.
///
/// # Implementing `Evented`
///
/// There are two types of `Evented` values.
///
/// * **System** handles, which are backed by sockets or other system handles.
/// These `Evented` handles will be monitored by the system selector. In this
/// case, an implementation of `Evented` delegates to a lower level handle.
///
/// * **User** handles, which are driven entirely in user space using
/// [`Registration`] and [`SetReadiness`]. In this case, the implementer takes
/// responsibility for driving the readiness state changes.
///
/// [`Poll`]: ../struct.Poll.html
/// [`Registration`]: ../struct.Registration.html
/// [`SetReadiness`]: ../struct.SetReadiness.html
///
/// # Examples
///
/// Implementing `Evented` on a struct containing a socket:
///
/// ```
/// use mio::{Ready, Poll, PollOpt, Token};
/// use mio::event::Evented;
/// use mio::net::TcpStream;
///
/// use std::io;
///
/// pub struct MyEvented {
/// socket: TcpStream,
/// }
///
/// impl Evented for MyEvented {
/// fn register(&self, poll: &Poll, token: Token, interest: Ready, opts: PollOpt)
/// -> io::Result<()>
/// {
/// // Delegate the `register` call to `socket`
/// self.socket.register(poll, token, interest, opts)
/// }
///
/// fn reregister(&self, poll: &Poll, token: Token, interest: Ready, opts: PollOpt)
/// -> io::Result<()>
/// {
/// // Delegate the `reregister` call to `socket`
/// self.socket.reregister(poll, token, interest, opts)
/// }
///
/// fn deregister(&self, poll: &Poll) -> io::Result<()> {
/// // Delegate the `deregister` call to `socket`
/// self.socket.deregister(poll)
/// }
/// }
/// ```
///
/// Implement `Evented` using [`Registration`] and [`SetReadiness`].
///
/// ```
/// use mio::{Ready, Registration, Poll, PollOpt, Token};
/// use mio::event::Evented;
///
/// use std::io;
/// use std::time::Instant;
/// use std::thread;
///
/// pub struct Deadline {
/// when: Instant,
/// registration: Registration,
/// }
///
/// impl Deadline {
/// pub fn new(when: Instant) -> Deadline {
/// let (registration, set_readiness) = Registration::new2();
///
/// thread::spawn(move || {
/// let now = Instant::now();
///
/// if now < when {
/// thread::sleep(when - now);
/// }
///
/// set_readiness.set_readiness(Ready::readable());
/// });
///
/// Deadline {
/// when: when,
/// registration: registration,
/// }
/// }
///
/// pub fn is_elapsed(&self) -> bool {
/// Instant::now() >= self.when
/// }
/// }
///
/// impl Evented for Deadline {
/// fn register(&self, poll: &Poll, token: Token, interest: Ready, opts: PollOpt)
/// -> io::Result<()>
/// {
/// self.registration.register(poll, token, interest, opts)
/// }
///
/// fn reregister(&self, poll: &Poll, token: Token, interest: Ready, opts: PollOpt)
/// -> io::Result<()>
/// {
/// self.registration.reregister(poll, token, interest, opts)
/// }
///
/// fn deregister(&self, poll: &Poll) -> io::Result<()> {
/// self.registration.deregister(poll)
/// }
/// }
/// ```
pub trait Evented {
/// Register `self` with the given `Poll` instance.
///
/// This function should not be called directly. Use [`Poll::register`]
/// instead. Implementors should handle registration by either delegating
/// the call to another `Evented` type or creating a [`Registration`].
///
/// [`Poll::register`]: ../struct.Poll.html#method.register
/// [`Registration`]: ../struct.Registration.html
fn register(&self, poll: &Poll, token: Token, interest: Ready, opts: PollOpt) -> io::Result<()>;
/// Re-register `self` with the given `Poll` instance.
///
/// This function should not be called directly. Use [`Poll::reregister`]
/// instead. Implementors should handle re-registration by either delegating
/// the call to another `Evented` type or calling
/// [`SetReadiness::set_readiness`].
///
/// [`Poll::reregister`]: ../struct.Poll.html#method.reregister
/// [`SetReadiness::set_readiness`]: ../struct.SetReadiness.html#method.set_readiness
fn reregister(&self, poll: &Poll, token: Token, interest: Ready, opts: PollOpt) -> io::Result<()>;
/// Deregister `self` from the given `Poll` instance
///
/// This function should not be called directly. Use [`Poll::deregister`]
/// instead. Implementors should handle deregistration by either delegating
/// the call to another `Evented` type or by dropping the [`Registration`]
/// associated with `self`.
///
/// [`Poll::deregister`]: ../struct.Poll.html#method.deregister
/// [`Registration`]: ../struct.Registration.html
fn deregister(&self, poll: &Poll) -> io::Result<()>;
}
/// Options supplied when registering an `Evented` handle with `Poll`
///
/// `PollOpt` values can be combined together using the various bitwise
/// operators.
///
/// For high level documentation on polling and poll options, see [`Poll`].
///
/// # Examples
///
/// ```
/// use mio::PollOpt;
///
/// let opts = PollOpt::edge() | PollOpt::oneshot();
///
/// assert!(opts.is_edge());
/// assert!(opts.is_oneshot());
/// assert!(!opts.is_level());
/// ```
///
/// [`Poll`]: struct.Poll.html
#[derive(Copy, PartialEq, Eq, Clone, PartialOrd, Ord)]
pub struct PollOpt(usize);
impl PollOpt {
/// Return a `PollOpt` representing no set options.
///
/// See [`Poll`] for more documentation on polling.
///
/// # Examples
///
/// ```
/// use mio::PollOpt;
///
/// let opt = PollOpt::empty();
///
/// assert!(!opt.is_level());
/// ```
///
/// [`Poll`]: struct.Poll.html
#[inline]
pub fn empty() -> PollOpt {
PollOpt(0)
}
/// Return a `PollOpt` representing edge-triggered notifications.
///
/// See [`Poll`] for more documentation on polling.
///
/// # Examples
///
/// ```
/// use mio::PollOpt;
///
/// let opt = PollOpt::edge();
///
/// assert!(opt.is_edge());
/// ```
///
/// [`Poll`]: struct.Poll.html
#[inline]
pub fn edge() -> PollOpt {
PollOpt(0b0001)
}
/// Return a `PollOpt` representing level-triggered notifications.
///
/// See [`Poll`] for more documentation on polling.
///
/// # Examples
///
/// ```
/// use mio::PollOpt;
///
/// let opt = PollOpt::level();
///
/// assert!(opt.is_level());
/// ```
///
/// [`Poll`]: struct.Poll.html
#[inline]
pub fn level() -> PollOpt {
PollOpt(0b0010)
}
/// Return a `PollOpt` representing oneshot notifications.
///
/// See [`Poll`] for more documentation on polling.
///
/// # Examples
///
/// ```
/// use mio::PollOpt;
///
/// let opt = PollOpt::oneshot();
///
/// assert!(opt.is_oneshot());
/// ```
///
/// [`Poll`]: struct.Poll.html
#[inline]
pub fn oneshot() -> PollOpt {
PollOpt(0b0100)
}
#[deprecated(since = "0.6.5", note = "removed")]
#[cfg(feature = "with-deprecated")]
#[doc(hidden)]
#[inline]
pub fn urgent() -> PollOpt {
PollOpt(0b1000)
}
#[deprecated(since = "0.6.5", note = "removed")]
#[cfg(feature = "with-deprecated")]
#[doc(hidden)]
#[inline]
pub fn all() -> PollOpt {
PollOpt::edge() | PollOpt::level() | PollOpt::oneshot()
}
/// Returns true if the options include edge-triggered notifications.
///
/// See [`Poll`] for more documentation on polling.
///
/// # Examples
///
/// ```
/// use mio::PollOpt;
///
/// let opt = PollOpt::edge();
///
/// assert!(opt.is_edge());
/// ```
///
/// [`Poll`]: struct.Poll.html
#[inline]
pub fn is_edge(&self) -> bool {
self.contains(PollOpt::edge())
}
/// Returns true if the options include level-triggered notifications.
///
/// See [`Poll`] for more documentation on polling.
///
/// # Examples
///
/// ```
/// use mio::PollOpt;
///
/// let opt = PollOpt::level();
///
/// assert!(opt.is_level());
/// ```
///
/// [`Poll`]: struct.Poll.html
#[inline]
pub fn is_level(&self) -> bool {
self.contains(PollOpt::level())
}
/// Returns true if the options includes oneshot.
///
/// See [`Poll`] for more documentation on polling.
///
/// # Examples
///
/// ```
/// use mio::PollOpt;
///
/// let opt = PollOpt::oneshot();
///
/// assert!(opt.is_oneshot());
/// ```
///
/// [`Poll`]: struct.Poll.html
#[inline]
pub fn is_oneshot(&self) -> bool {
self.contains(PollOpt::oneshot())
}
#[deprecated(since = "0.6.5", note = "removed")]
#[cfg(feature = "with-deprecated")]
#[doc(hidden)]
#[allow(deprecated)]
#[inline]
pub fn is_urgent(&self) -> bool {
self.contains(PollOpt::urgent())
}
#[deprecated(since = "0.6.5", note = "removed")]
#[cfg(feature = "with-deprecated")]
#[doc(hidden)]
#[inline]
pub fn bits(&self) -> usize {
self.0
}
/// Returns true if `self` is a superset of `other`.
///
/// `other` may represent more than one option, in which case the function
/// only returns true if `self` contains all of the options specified in
/// `other`.
///
/// See [`Poll`] for more documentation on polling.
///
/// # Examples
///
/// ```
/// use mio::PollOpt;
///
/// let opt = PollOpt::oneshot();
///
/// assert!(opt.contains(PollOpt::oneshot()));
/// assert!(!opt.contains(PollOpt::edge()));
/// ```
///
/// ```
/// use mio::PollOpt;
///
/// let opt = PollOpt::oneshot() | PollOpt::edge();
///
/// assert!(opt.contains(PollOpt::oneshot()));
/// assert!(opt.contains(PollOpt::edge()));
/// ```
///
/// ```
/// use mio::PollOpt;
///
/// let opt = PollOpt::oneshot() | PollOpt::edge();
///
/// assert!(!PollOpt::oneshot().contains(opt));
/// assert!(opt.contains(opt));
/// assert!((opt | PollOpt::level()).contains(opt));
/// ```
///
/// [`Poll`]: struct.Poll.html
#[inline]
pub fn contains(&self, other: PollOpt) -> bool {
(*self & other) == other
}
/// Adds all options represented by `other` into `self`.
///
/// This is equivalent to `*self = *self | other`.
///
/// # Examples
///
/// ```
/// use mio::PollOpt;
///
/// let mut opt = PollOpt::empty();
/// opt.insert(PollOpt::oneshot());
///
/// assert!(opt.is_oneshot());
/// ```
#[inline]
pub fn insert(&mut self, other: PollOpt) {
self.0 |= other.0;
}
/// Removes all options represented by `other` from `self`.
///
/// This is equivalent to `*self = *self & !other`.
///
/// # Examples
///
/// ```
/// use mio::PollOpt;
///
/// let mut opt = PollOpt::oneshot();
/// opt.remove(PollOpt::oneshot());
///
/// assert!(!opt.is_oneshot());
/// ```
#[inline]
pub fn remove(&mut self, other: PollOpt) {
self.0 &= !other.0;
}
}
impl ops::BitOr for PollOpt {
type Output = PollOpt;
#[inline]
fn bitor(self, other: PollOpt) -> PollOpt {
PollOpt(self.0 | other.0)
}
}
impl ops::BitXor for PollOpt {
type Output = PollOpt;
#[inline]
fn bitxor(self, other: PollOpt) -> PollOpt {
PollOpt(self.0 ^ other.0)
}
}
impl ops::BitAnd for PollOpt {
type Output = PollOpt;
#[inline]
fn bitand(self, other: PollOpt) -> PollOpt {
PollOpt(self.0 & other.0)
}
}
impl ops::Sub for PollOpt {
type Output = PollOpt;
#[inline]
fn sub(self, other: PollOpt) -> PollOpt {
PollOpt(self.0 & !other.0)
}
}
#[deprecated(since = "0.6.10", note = "removed")]
#[cfg(feature = "with-deprecated")]
#[doc(hidden)]
impl ops::Not for PollOpt {
type Output = PollOpt;
#[inline]
fn not(self) -> PollOpt {
PollOpt(!self.0)
}
}
impl fmt::Debug for PollOpt {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
let mut one = false;
let flags = [
(PollOpt::edge(), "Edge-Triggered"),
(PollOpt::level(), "Level-Triggered"),
(PollOpt::oneshot(), "OneShot")];
for &(flag, msg) in &flags {
if self.contains(flag) {
if one { write!(fmt, " | ")? }
write!(fmt, "{}", msg)?;
one = true
}
}
if !one {
fmt.write_str("(empty)")?;
}
Ok(())
}
}
#[test]
fn test_debug_pollopt() {
assert_eq!("(empty)", format!("{:?}", PollOpt::empty()));
assert_eq!("Edge-Triggered", format!("{:?}", PollOpt::edge()));
assert_eq!("Level-Triggered", format!("{:?}", PollOpt::level()));
assert_eq!("OneShot", format!("{:?}", PollOpt::oneshot()));
}
/// A set of readiness event kinds
///
/// `Ready` is a set of operation descriptors indicating which kind of an
/// operation is ready to be performed. For example, `Ready::readable()`
/// indicates that the associated `Evented` handle is ready to perform a
/// `read` operation.
///
/// This struct only represents portable event kinds. Since only readable and
/// writable events are guaranteed to be raised on all systems, those are the
/// only ones available via the `Ready` struct. There are also platform specific
/// extensions to `Ready`, i.e. `UnixReady`, which provide additional readiness
/// event kinds only available on unix platforms.
///
/// `Ready` values can be combined together using the various bitwise operators.
///
/// For high level documentation on polling and readiness, see [`Poll`].
///
/// # Examples
///
/// ```
/// use mio::Ready;
///
/// let ready = Ready::readable() | Ready::writable();
///
/// assert!(ready.is_readable());
/// assert!(ready.is_writable());
/// ```
///
/// [`Poll`]: struct.Poll.html
/// [`readable`]: #method.readable
/// [`writable`]: #method.writable
/// [readiness]: struct.Poll.html#readiness-operations
#[derive(Copy, PartialEq, Eq, Clone, PartialOrd, Ord)]
pub struct Ready(usize);
const READABLE: usize = 0b00001;
const WRITABLE: usize = 0b00010;
const ERROR: usize = 0b00100;
const HUP: usize = 0b01000;
impl Ready {
/// Returns the empty `Ready` set.
///
/// See [`Poll`] for more documentation on polling.
///
/// # Examples
///
/// ```
/// use mio::Ready;
///
/// let ready = Ready::empty();
///
/// assert!(!ready.is_readable());
/// ```
///
/// [`Poll`]: struct.Poll.html
pub fn empty() -> Ready {
Ready(0)
}
#[deprecated(since = "0.6.5", note = "use Ready::empty instead")]
#[cfg(feature = "with-deprecated")]
#[doc(hidden)]
pub fn none() -> Ready {
Ready::empty()
}
/// Returns a `Ready` representing readable readiness.
///
/// See [`Poll`] for more documentation on polling.
///
/// # Examples
///
/// ```
/// use mio::Ready;
///
/// let ready = Ready::readable();
///
/// assert!(ready.is_readable());
/// ```
///
/// [`Poll`]: struct.Poll.html
#[inline]
pub fn readable() -> Ready {
Ready(READABLE)
}
/// Returns a `Ready` representing writable readiness.
///
/// See [`Poll`] for more documentation on polling.
///
/// # Examples
///
/// ```
/// use mio::Ready;
///
/// let ready = Ready::writable();
///
/// assert!(ready.is_writable());
/// ```
///
/// [`Poll`]: struct.Poll.html
#[inline]
pub fn writable() -> Ready {
Ready(WRITABLE)
}
#[deprecated(since = "0.6.5", note = "use UnixReady instead")]
#[cfg(feature = "with-deprecated")]
#[doc(hidden)]
#[inline]
pub fn error() -> Ready {
Ready(ERROR)
}
#[deprecated(since = "0.6.5", note = "use UnixReady instead")]
#[cfg(feature = "with-deprecated")]
#[doc(hidden)]
#[inline]
pub fn hup() -> Ready {
Ready(HUP)
}
#[deprecated(since = "0.6.5", note = "removed")]
#[cfg(feature = "with-deprecated")]
#[doc(hidden)]
#[inline]
pub fn all() -> Ready {
Ready::readable() |
Ready::writable()
}
/// Returns true if `Ready` is the empty set
///
/// See [`Poll`] for more documentation on polling.
///
/// # Examples
///
/// ```
/// use mio::Ready;
///
/// let ready = Ready::empty();
/// assert!(ready.is_empty());
/// ```
#[inline]
pub fn is_empty(&self) -> bool {
*self == Ready::empty()
}
#[deprecated(since = "0.6.5", note = "use Ready::is_empty instead")]
#[cfg(feature = "with-deprecated")]
#[doc(hidden)]
#[inline]
pub fn is_none(&self) -> bool {
self.is_empty()
}
/// Returns true if the value includes readable readiness
///
/// See [`Poll`] for more documentation on polling.
///
/// # Examples
///
/// ```
/// use mio::Ready;
///
/// let ready = Ready::readable();
///
/// assert!(ready.is_readable());
/// ```
///
/// [`Poll`]: struct.Poll.html
#[inline]
pub fn is_readable(&self) -> bool {
self.contains(Ready::readable())
}
/// Returns true if the value includes writable readiness
///
/// See [`Poll`] for more documentation on polling.
///
/// # Examples
///
/// ```
/// use mio::Ready;
///
/// let ready = Ready::writable();
///
/// assert!(ready.is_writable());
/// ```
///
/// [`Poll`]: struct.Poll.html
#[inline]
pub fn is_writable(&self) -> bool {
self.contains(Ready::writable())
}
#[deprecated(since = "0.6.5", note = "use UnixReady instead")]
#[cfg(feature = "with-deprecated")]
#[doc(hidden)]
#[inline]
pub fn is_error(&self) -> bool {
self.contains(Ready(ERROR))
}
#[deprecated(since = "0.6.5", note = "use UnixReady instead")]
#[cfg(feature = "with-deprecated")]
#[doc(hidden)]
#[inline]
pub fn is_hup(&self) -> bool {
self.contains(Ready(HUP))
}
/// Adds all readiness represented by `other` into `self`.
///
/// This is equivalent to `*self = *self | other`.
///
/// # Examples
///
/// ```
/// use mio::Ready;
///
/// let mut readiness = Ready::empty();
/// readiness.insert(Ready::readable());
///
/// assert!(readiness.is_readable());
/// ```
#[inline]
pub fn insert<T: Into<Self>>(&mut self, other: T) {
let other = other.into();
self.0 |= other.0;
}
/// Removes all options represented by `other` from `self`.
///
/// This is equivalent to `*self = *self & !other`.
///
/// # Examples
///
/// ```
/// use mio::Ready;
///
/// let mut readiness = Ready::readable();
/// readiness.remove(Ready::readable());
///
/// assert!(!readiness.is_readable());
/// ```
#[inline]
pub fn remove<T: Into<Self>>(&mut self, other: T) {
let other = other.into();
self.0 &= !other.0;
}
#[deprecated(since = "0.6.5", note = "removed")]
#[cfg(feature = "with-deprecated")]
#[doc(hidden)]
#[inline]
pub fn bits(&self) -> usize {
self.0
}
/// Returns true if `self` is a superset of `other`.
///
/// `other` may represent more than one readiness operations, in which case
/// the function only returns true if `self` contains all readiness
/// specified in `other`.
///
/// See [`Poll`] for more documentation on polling.
///
/// # Examples
///
/// ```
/// use mio::Ready;
///
/// let readiness = Ready::readable();
///
/// assert!(readiness.contains(Ready::readable()));
/// assert!(!readiness.contains(Ready::writable()));
/// ```
///
/// ```
/// use mio::Ready;
///
/// let readiness = Ready::readable() | Ready::writable();
///
/// assert!(readiness.contains(Ready::readable()));
/// assert!(readiness.contains(Ready::writable()));
/// ```
///
/// ```
/// use mio::Ready;
///
/// let readiness = Ready::readable() | Ready::writable();
///
/// assert!(!Ready::readable().contains(readiness));
/// assert!(readiness.contains(readiness));
/// ```
///
/// [`Poll`]: struct.Poll.html
#[inline]
pub fn contains<T: Into<Self>>(&self, other: T) -> bool {
let other = other.into();
(*self & other) == other
}
}
impl<T: Into<Ready>> ops::BitOr<T> for Ready {
type Output = Ready;
#[inline]
fn bitor(self, other: T) -> Ready {
Ready(self.0 | other.into().0)
}
}
impl<T: Into<Ready>> ops::BitOrAssign<T> for Ready {
#[inline]
fn bitor_assign(&mut self, other: T) {
self.0 |= other.into().0;
}
}
impl<T: Into<Ready>> ops::BitXor<T> for Ready {
type Output = Ready;
#[inline]
fn bitxor(self, other: T) -> Ready {
Ready(self.0 ^ other.into().0)
}
}
impl<T: Into<Ready>> ops::BitXorAssign<T> for Ready {
#[inline]
fn bitxor_assign(&mut self, other: T) {
self.0 ^= other.into().0;
}
}
impl<T: Into<Ready>> ops::BitAnd<T> for Ready {
type Output = Ready;
#[inline]
fn bitand(self, other: T) -> Ready {
Ready(self.0 & other.into().0)
}
}
impl<T: Into<Ready>> ops::BitAndAssign<T> for Ready {
#[inline]
fn bitand_assign(&mut self, other: T) {
self.0 &= other.into().0
}
}
impl<T: Into<Ready>> ops::Sub<T> for Ready {
type Output = Ready;
#[inline]
fn sub(self, other: T) -> Ready {
Ready(self.0 & !other.into().0)
}
}
impl<T: Into<Ready>> ops::SubAssign<T> for Ready {
#[inline]
fn sub_assign(&mut self, other: T) {
self.0 &= !other.into().0;
}
}
#[deprecated(since = "0.6.10", note = "removed")]
#[cfg(feature = "with-deprecated")]
#[doc(hidden)]
impl ops::Not for Ready {
type Output = Ready;
#[inline]
fn not(self) -> Ready {
Ready(!self.0)
}
}
impl fmt::Debug for Ready {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
let mut one = false;
let flags = [
(Ready::readable(), "Readable"),
(Ready::writable(), "Writable"),
(Ready(ERROR), "Error"),
(Ready(HUP), "Hup")];
for &(flag, msg) in &flags {
if self.contains(flag) {
if one { write!(fmt, " | ")? }
write!(fmt, "{}", msg)?;
one = true
}
}
if !one {
fmt.write_str("(empty)")?;
}
Ok(())
}
}
#[test]
fn test_debug_ready() {
assert_eq!("(empty)", format!("{:?}", Ready::empty()));
assert_eq!("Readable", format!("{:?}", Ready::readable()));
assert_eq!("Writable", format!("{:?}", Ready::writable()));
}
/// An readiness event returned by [`Poll::poll`].
///
/// `Event` is a [readiness state] paired with a [`Token`]. It is returned by
/// [`Poll::poll`].
///
/// For more documentation on polling and events, see [`Poll`].
///
/// # Examples
///
/// ```
/// use mio::{Ready, Token};
/// use mio::event::Event;
///
/// let event = Event::new(Ready::readable() | Ready::writable(), Token(0));
///
/// assert_eq!(event.readiness(), Ready::readable() | Ready::writable());
/// assert_eq!(event.token(), Token(0));
/// ```
///
/// [`Poll::poll`]: ../struct.Poll.html#method.poll
/// [`Poll`]: ../struct.Poll.html
/// [readiness state]: ../struct.Ready.html
/// [`Token`]: ../struct.Token.html
#[derive(Copy, Clone, Eq, PartialEq, Debug)]
pub struct Event {
kind: Ready,
token: Token
}
impl Event {
/// Creates a new `Event` containing `readiness` and `token`
///
/// # Examples
///
/// ```
/// use mio::{Ready, Token};
/// use mio::event::Event;
///
/// let event = Event::new(Ready::readable() | Ready::writable(), Token(0));
///
/// assert_eq!(event.readiness(), Ready::readable() | Ready::writable());
/// assert_eq!(event.token(), Token(0));
/// ```
pub fn new(readiness: Ready, token: Token) -> Event {
Event {
kind: readiness,
token: token,
}
}
/// Returns the event's readiness.
///
/// # Examples
///
/// ```
/// use mio::{Ready, Token};
/// use mio::event::Event;
///
/// let event = Event::new(Ready::readable() | Ready::writable(), Token(0));
///
/// assert_eq!(event.readiness(), Ready::readable() | Ready::writable());
/// ```
pub fn readiness(&self) -> Ready {
self.kind
}
#[deprecated(since = "0.6.5", note = "use Event::readiness()")]
#[cfg(feature = "with-deprecated")]
#[doc(hidden)]
pub fn kind(&self) -> Ready {
self.kind
}
/// Returns the event's token.
///
/// # Examples
///
/// ```
/// use mio::{Ready, Token};
/// use mio::event::Event;
///
/// let event = Event::new(Ready::readable() | Ready::writable(), Token(0));
///
/// assert_eq!(event.token(), Token(0));
/// ```
pub fn token(&self) -> Token {
self.token
}
}
/*
*
* ===== Mio internal helpers =====
*
*/
pub fn ready_as_usize(events: Ready) -> usize {
events.0
}
pub fn opt_as_usize(opt: PollOpt) -> usize {
opt.0
}
pub fn ready_from_usize(events: usize) -> Ready {
Ready(events)
}
pub fn opt_from_usize(opt: usize) -> PollOpt {
PollOpt(opt)
}
// Used internally to mutate an `Event` in place
// Not used on all platforms
#[allow(dead_code)]
pub fn kind_mut(event: &mut Event) -> &mut Ready {
&mut event.kind
}