1use alloc::{boxed::Box, sync::Arc};
2
3pub struct Callback(Box<dyn FnOnce()>);
5
6impl Callback {
7    pub fn new<F: FnOnce() + 'static>(callback: F) -> Self {
9        Self(Box::new(callback))
10    }
11
12    pub fn call(self) {
14        (self.0)()
15    }
16}
17
18impl<T: FnOnce() + 'static> From<T> for Callback {
19    fn from(callback: T) -> Self {
20        Self::new(callback)
21    }
22}
23
24#[derive(Clone)]
26pub struct MulticastCallback(Arc<dyn Fn()>);
27
28impl MulticastCallback {
29    pub fn new<F: Fn() + 'static>(callback: F) -> Self {
31        Self(Arc::new(callback))
32    }
33
34    pub fn into_unicast(self) -> Callback {
36        Callback(Box::new(move || (self.0)()))
37    }
38
39    pub fn call(self) {
41        (self.0)()
42    }
43}
44
45impl<T: Fn() + 'static> From<T> for MulticastCallback {
46    fn from(callback: T) -> Self {
47        Self::new(callback)
48    }
49}
50
51pub struct IpiEvent {
53    pub src_cpu_id: usize,
55    pub callback: Callback,
57}