230 lines
5.7 KiB
Rust
230 lines
5.7 KiB
Rust
use crate::event::Event;
|
|
use crate::sys;
|
|
|
|
use std::fmt;
|
|
|
|
/// A collection of readiness events.
|
|
///
|
|
/// `Events` is passed as an argument to [`Poll::poll`] and will be used to
|
|
/// receive any new readiness events received since the last poll. Usually, a
|
|
/// single `Events` instance is created at the same time as a [`Poll`] and
|
|
/// reused on each call to [`Poll::poll`].
|
|
///
|
|
/// See [`Poll`] for more documentation on polling.
|
|
///
|
|
/// [`Poll::poll`]: ../struct.Poll.html#method.poll
|
|
/// [`Poll`]: ../struct.Poll.html
|
|
///
|
|
/// # Examples
|
|
///
|
|
#[cfg_attr(feature = "os-poll", doc = "```")]
|
|
#[cfg_attr(not(feature = "os-poll"), doc = "```ignore")]
|
|
/// # use std::error::Error;
|
|
/// # fn main() -> Result<(), Box<dyn Error>> {
|
|
/// use mio::{Events, Poll};
|
|
/// use std::time::Duration;
|
|
///
|
|
/// let mut events = Events::with_capacity(1024);
|
|
/// let mut poll = Poll::new()?;
|
|
/// #
|
|
/// # assert!(events.is_empty());
|
|
///
|
|
/// // Register `event::Source`s with `poll`.
|
|
///
|
|
/// poll.poll(&mut events, Some(Duration::from_millis(100)))?;
|
|
///
|
|
/// for event in events.iter() {
|
|
/// println!("Got an event for {:?}", event.token());
|
|
/// }
|
|
/// # Ok(())
|
|
/// # }
|
|
/// ```
|
|
pub struct Events {
|
|
inner: sys::Events,
|
|
}
|
|
|
|
/// [`Events`] iterator.
|
|
///
|
|
/// This struct is created by the [`iter`] method on [`Events`].
|
|
///
|
|
/// [`Events`]: struct.Events.html
|
|
/// [`iter`]: struct.Events.html#method.iter
|
|
///
|
|
/// # Examples
|
|
///
|
|
#[cfg_attr(feature = "os-poll", doc = "```")]
|
|
#[cfg_attr(not(feature = "os-poll"), doc = "```ignore")]
|
|
/// # use std::error::Error;
|
|
/// # fn main() -> Result<(), Box<dyn Error>> {
|
|
/// use mio::{Events, Poll};
|
|
/// use std::time::Duration;
|
|
///
|
|
/// let mut events = Events::with_capacity(1024);
|
|
/// let mut poll = Poll::new()?;
|
|
///
|
|
/// // Register handles with `poll`.
|
|
///
|
|
/// poll.poll(&mut events, Some(Duration::from_millis(100)))?;
|
|
///
|
|
/// for event in events.iter() {
|
|
/// println!("Got an event for {:?}", event.token());
|
|
/// }
|
|
/// # Ok(())
|
|
/// # }
|
|
/// ```
|
|
#[derive(Debug, Clone)]
|
|
pub struct Iter<'a> {
|
|
inner: &'a Events,
|
|
pos: usize,
|
|
}
|
|
|
|
impl Events {
|
|
/// Return a new `Events` capable of holding up to `capacity` events.
|
|
///
|
|
/// # Examples
|
|
///
|
|
/// ```
|
|
/// use mio::Events;
|
|
///
|
|
/// let events = Events::with_capacity(1024);
|
|
/// assert_eq!(1024, events.capacity());
|
|
/// ```
|
|
pub fn with_capacity(capacity: usize) -> Events {
|
|
Events {
|
|
inner: sys::Events::with_capacity(capacity),
|
|
}
|
|
}
|
|
|
|
/// Returns the number of `Event` values that `self` can hold.
|
|
///
|
|
/// ```
|
|
/// use mio::Events;
|
|
///
|
|
/// let events = Events::with_capacity(1024);
|
|
/// assert_eq!(1024, events.capacity());
|
|
/// ```
|
|
pub fn capacity(&self) -> usize {
|
|
self.inner.capacity()
|
|
}
|
|
|
|
/// Returns `true` if `self` contains no `Event` values.
|
|
///
|
|
/// # Examples
|
|
///
|
|
/// ```
|
|
/// use mio::Events;
|
|
///
|
|
/// let events = Events::with_capacity(1024);
|
|
/// assert!(events.is_empty());
|
|
/// ```
|
|
pub fn is_empty(&self) -> bool {
|
|
self.inner.is_empty()
|
|
}
|
|
|
|
/// Returns an iterator over the `Event` values.
|
|
///
|
|
/// # Examples
|
|
///
|
|
#[cfg_attr(feature = "os-poll", doc = "```")]
|
|
#[cfg_attr(not(feature = "os-poll"), doc = "```ignore")]
|
|
/// # use std::error::Error;
|
|
/// # fn main() -> Result<(), Box<dyn Error>> {
|
|
/// use mio::{Events, Poll};
|
|
/// use std::time::Duration;
|
|
///
|
|
/// let mut events = Events::with_capacity(1024);
|
|
/// let mut poll = Poll::new()?;
|
|
///
|
|
/// // Register handles with `poll`.
|
|
///
|
|
/// poll.poll(&mut events, Some(Duration::from_millis(100)))?;
|
|
///
|
|
/// for event in events.iter() {
|
|
/// println!("Got an event for {:?}", event.token());
|
|
/// }
|
|
/// # Ok(())
|
|
/// # }
|
|
/// ```
|
|
pub fn iter(&self) -> Iter<'_> {
|
|
Iter {
|
|
inner: self,
|
|
pos: 0,
|
|
}
|
|
}
|
|
|
|
/// Clearing all `Event` values from container explicitly.
|
|
///
|
|
/// # Notes
|
|
///
|
|
/// Events are cleared before every `poll`, so it is not required to call
|
|
/// this manually.
|
|
///
|
|
/// # Examples
|
|
///
|
|
#[cfg_attr(feature = "os-poll", doc = "```")]
|
|
#[cfg_attr(not(feature = "os-poll"), doc = "```ignore")]
|
|
/// # use std::error::Error;
|
|
/// # fn main() -> Result<(), Box<dyn Error>> {
|
|
/// use mio::{Events, Poll};
|
|
/// use std::time::Duration;
|
|
///
|
|
/// let mut events = Events::with_capacity(1024);
|
|
/// let mut poll = Poll::new()?;
|
|
///
|
|
/// // Register handles with `poll`.
|
|
///
|
|
/// poll.poll(&mut events, Some(Duration::from_millis(100)))?;
|
|
///
|
|
/// // Clear all events.
|
|
/// events.clear();
|
|
/// assert!(events.is_empty());
|
|
/// # Ok(())
|
|
/// # }
|
|
/// ```
|
|
pub fn clear(&mut self) {
|
|
self.inner.clear();
|
|
}
|
|
|
|
/// Returns the inner `sys::Events`.
|
|
pub(crate) fn sys(&mut self) -> &mut sys::Events {
|
|
&mut self.inner
|
|
}
|
|
}
|
|
|
|
impl<'a> IntoIterator for &'a Events {
|
|
type Item = &'a Event;
|
|
type IntoIter = Iter<'a>;
|
|
|
|
fn into_iter(self) -> Self::IntoIter {
|
|
self.iter()
|
|
}
|
|
}
|
|
|
|
impl<'a> Iterator for Iter<'a> {
|
|
type Item = &'a Event;
|
|
|
|
fn next(&mut self) -> Option<Self::Item> {
|
|
let ret = self
|
|
.inner
|
|
.inner
|
|
.get(self.pos)
|
|
.map(Event::from_sys_event_ref);
|
|
self.pos += 1;
|
|
ret
|
|
}
|
|
|
|
fn size_hint(&self) -> (usize, Option<usize>) {
|
|
let size = self.inner.inner.len();
|
|
(size, Some(size))
|
|
}
|
|
|
|
fn count(self) -> usize {
|
|
self.inner.inner.len()
|
|
}
|
|
}
|
|
|
|
impl fmt::Debug for Events {
|
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
f.debug_list().entries(self).finish()
|
|
}
|
|
}
|