micromegas_tracing/
panic_hook.rs1#[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}