wasmtime/runtime/vm/sys/unix/
traphandlers.rs

1cfg_if::cfg_if! {
2    if #[cfg(not(has_native_signals))] {
3        // If signals-based traps are disabled statically then there's no
4        // platform signal handler and no per-thread init, so stub these both
5        // out.
6        pub enum SignalHandler {}
7
8        #[inline]
9        pub fn lazy_per_thread_init() {}
10    } else if #[cfg(target_vendor = "apple")] {
11        // On macOS a dynamic decision is made to use mach ports or signals at
12        // process initialization time.
13
14        /// Whether or not macOS is using mach ports.
15        static mut USE_MACH_PORTS: bool = false;
16
17        pub use super::signals::SignalHandler;
18
19        pub enum TrapHandler {
20            Signals(super::signals::TrapHandler),
21            #[allow(dead_code)] // used for its drop
22            MachPorts(super::machports::TrapHandler),
23        }
24
25        impl TrapHandler {
26            pub unsafe fn new(macos_use_mach_ports: bool) -> TrapHandler {
27                unsafe {
28                    USE_MACH_PORTS = macos_use_mach_ports;
29                    if macos_use_mach_ports {
30                        TrapHandler::MachPorts(super::machports::TrapHandler::new())
31                    } else {
32                        TrapHandler::Signals(super::signals::TrapHandler::new(false))
33                    }
34                }
35            }
36
37            pub fn validate_config(&self, macos_use_mach_ports: bool) {
38                match self {
39                    TrapHandler::Signals(t) => t.validate_config(macos_use_mach_ports),
40                    TrapHandler::MachPorts(_) => assert!(macos_use_mach_ports),
41                }
42            }
43        }
44
45        pub fn lazy_per_thread_init() {
46            unsafe {
47                if USE_MACH_PORTS {
48                    super::machports::lazy_per_thread_init();
49                } else {
50                    super::signals::lazy_per_thread_init();
51                }
52            }
53        }
54    } else {
55        // Otherwise unix platforms use the signals-based implementation of
56        // these functions.
57        pub use super::signals::{TrapHandler, SignalHandler, lazy_per_thread_init};
58    }
59}