use alloc::{boxed::Box, sync::Arc};
pub struct Callback(Box<dyn FnOnce()>);
impl Callback {
pub fn new<F: FnOnce() + 'static>(callback: F) -> Self {
Self(Box::new(callback))
}
pub fn call(self) {
(self.0)()
}
}
impl<T: FnOnce() + 'static> From<T> for Callback {
fn from(callback: T) -> Self {
Self::new(callback)
}
}
#[derive(Clone)]
pub struct MulticastCallback(Arc<dyn Fn()>);
impl MulticastCallback {
pub fn new<F: Fn() + 'static>(callback: F) -> Self {
Self(Arc::new(callback))
}
pub fn into_unicast(self) -> Callback {
Callback(Box::new(move || (self.0)()))
}
pub fn call(self) {
(self.0)()
}
}
impl<T: Fn() + 'static> From<T> for MulticastCallback {
fn from(callback: T) -> Self {
Self::new(callback)
}
}
pub struct IpiEvent {
pub src_cpu_id: usize,
pub callback: Callback,
}