use alloc::collections::VecDeque;
use crate::event::{Callback, IpiEvent};
pub struct IpiEventQueue {
events: VecDeque<IpiEvent>,
}
impl IpiEventQueue {
pub fn new() -> Self {
Self {
events: VecDeque::new(),
}
}
#[allow(dead_code)]
#[inline]
pub fn is_empty(&self) -> bool {
self.events.is_empty()
}
pub fn push(&mut self, src_cpu_id: usize, callback: Callback) {
self.events.push_back(IpiEvent {
src_cpu_id,
callback,
});
}
#[must_use]
pub fn pop_one(&mut self) -> Option<(usize, Callback)> {
if let Some(e) = self.events.pop_front() {
Some((e.src_cpu_id, e.callback))
} else {
None
}
}
}
impl Default for IpiEventQueue {
fn default() -> Self {
Self::new()
}
}