micromegas_tracing/
panic_hook.rs

1//! Reports panics as fatal log entries and shuts down the telemetry system
2#[cfg(not(target_arch = "wasm32"))]
3use std::io::Write;
4use std::panic::{PanicHookInfo, take_hook};
5use std::sync::Mutex;
6
7use crate::fatal;
8use crate::guards::shutdown_telemetry;
9
10pub fn init_panic_hook() {
11    type BoxedHook = Box<dyn Fn(&PanicHookInfo<'_>) + Sync + Send + 'static>;
12    static PREVIOUS_HOOK: Mutex<Option<BoxedHook>> = Mutex::new(None);
13
14    {
15        let mut previous_hook_lock = PREVIOUS_HOOK.lock().unwrap();
16        assert!(previous_hook_lock.is_none());
17        *previous_hook_lock = Some(take_hook());
18    }
19
20    std::panic::set_hook(Box::new(|panic_info| {
21        fatal!("panic: {:?}", panic_info);
22        shutdown_telemetry();
23        if let Ok(guard) = PREVIOUS_HOOK.lock()
24            && let Some(hook) = guard.as_ref()
25        {
26            #[cfg(not(target_arch = "wasm32"))]
27            std::io::stdout().flush().unwrap();
28            hook(panic_info);
29        }
30    }));
31}