#[cfg(all(not(feature = "std"), feature = "user_space"))]
use alloc::vec::Vec;
use core::time::Duration;
use log::trace;
use crate::event::{self, Event};
#[derive(Debug)]
pub struct Queue {
events: Vec<Event>,
}
impl Queue {
pub fn new() -> Queue {
Queue {
events: Vec::new(),
}
}
pub fn add(&mut self, event: Event) {
trace!("adding user space event: id={}, readiness={:?}",
event.id(), event.readiness());
self.events.push(event);
}
}
impl<ES, E> event::Source<ES, E> for Queue
where ES: event::Sink,
{
fn max_timeout(&self) -> Option<Duration> {
if !self.events.is_empty() {
Some(Duration::from_millis(0))
} else {
None
}
}
fn poll(&mut self, event_sink: &mut ES) -> Result<(), E> {
trace!("polling user space events");
let drain = self.events.drain(..event_sink.capacity_left().min(self.events.len()));
event_sink.extend(drain);
Ok(())
}
}
impl Default for Queue {
fn default() -> Queue {
Queue::new()
}
}