wasmer_wasix/os/task/
signal.rs1use 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
9pub trait SignalHandlerAbi
11where
12 Self: std::fmt::Debug,
13{
14 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 pub signal: Signal,
24 pub interval: Duration,
26 pub repeat: bool,
28 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}