wasmer_wasix/os/task/
signal.rs

1use std::{sync::Arc, time::Duration};
2
3use wasmer_wasix_types::types::Signal;
4
5#[derive(thiserror::Error, Debug)]
6#[error("Signal could not be delivered")]
7pub struct SignalDeliveryError;
8
9/// Signal handles...well...they process signals
10pub trait SignalHandlerAbi
11where
12    Self: std::fmt::Debug,
13{
14    /// Processes a signal
15    fn signal(&self, signal: u8) -> Result<(), SignalDeliveryError>;
16}
17
18pub type DynSignalHandlerAbi = dyn SignalHandlerAbi + Send + Sync + 'static;
19
20#[derive(Debug)]
21pub struct WasiSignalInterval {
22    /// Signal that will be raised
23    pub signal: Signal,
24    /// Time between the signals
25    pub interval: Duration,
26    /// Flag that indicates if the signal should repeat
27    pub repeat: bool,
28    /// Last time that a signal was triggered
29    pub last_signal: u128,
30}
31
32pub fn default_signal_handler() -> Arc<DynSignalHandlerAbi> {
33    #[derive(Debug)]
34    struct DefaultHandler {}
35    impl SignalHandlerAbi for DefaultHandler {
36        fn signal(&self, signal: u8) -> Result<(), SignalDeliveryError> {
37            if let Ok(signal) = TryInto::<Signal>::try_into(signal) {
38                match signal {
39                    Signal::Sigkill
40                    | Signal::Sigterm
41                    | Signal::Sigabrt
42                    | Signal::Sigquit
43                    | Signal::Sigint
44                    | Signal::Sigstop => {
45                        tracing::debug!("handling terminate signal");
46                        std::process::exit(1);
47                    }
48                    signal => tracing::info!("unhandled signal - {:?}", signal),
49                }
50            } else {
51                tracing::info!("unknown signal - {}", signal)
52            }
53            Ok(())
54        }
55    }
56    Arc::new(DefaultHandler {})
57}