sel4_panicking/
hook.rs

1//
2// Copyright 2023, Colias Group, LLC
3//
4// SPDX-License-Identifier: BSD-2-Clause
5//
6
7use core::panic::PanicInfo;
8
9use sel4_immediate_sync_once_cell::ImmediateSyncOnceCell;
10use sel4_panicking_env::debug_println;
11
12/// Type for panic hooks.
13///
14/// See [`set_hook`].
15pub type PanicHook = &'static (dyn Fn(&PanicInfo) + Send + Sync);
16
17static PANIC_HOOK: ImmediateSyncOnceCell<PanicHook> = ImmediateSyncOnceCell::new();
18
19/// Like `std::panic::set_hook`.
20pub fn set_hook(hook: PanicHook) {
21    PANIC_HOOK.set(hook).unwrap_or_else(|_| panic!())
22}
23
24pub(crate) fn get_hook() -> &'static PanicHook {
25    const DEFAULT_HOOK: PanicHook = &default_hook;
26    PANIC_HOOK.get().unwrap_or(&DEFAULT_HOOK)
27}
28
29fn default_hook(info: &PanicInfo) {
30    debug_println!("{}", info);
31}