misty_vm/
signals.rs

1use std::sync::{Arc, RwLock};
2
3pub enum MistySignal {
4    Schedule,
5}
6
7pub struct SignalEmitter {
8    handler: Arc<RwLock<Arc<dyn Fn(MistySignal) + Send + Sync + 'static>>>,
9}
10
11impl SignalEmitter {
12    pub fn new() -> Self {
13        Self {
14            handler: Arc::new(RwLock::new(Arc::new(|_| {
15                tracing::warn!("singal emiiter is not binding any handler");
16            }))),
17        }
18    }
19
20    pub fn set(&self, f: impl Fn(MistySignal) + Send + Sync + 'static) {
21        let mut w = self.handler.write().unwrap();
22        *w = Arc::new(f);
23    }
24
25    pub(crate) fn emit(&self, singal: MistySignal) {
26        let f = self.handler.read().unwrap().clone();
27        f(singal);
28    }
29}