use crate::sync::atomic::{AtomicBool, Ordering};
use crate::sys::stdio::panic_output;
use crate::sys_common::backtrace::{self, RustBacktrace};
-use crate::sys_common::rwlock::RWLock;
+use crate::sys_common::rwlock::StaticRWLock;
use crate::sys_common::thread_info;
use crate::thread;
Custom(*mut (dyn Fn(&PanicInfo<'_>) + 'static + Sync + Send)),
}
-static HOOK_LOCK: RWLock = RWLock::new();
+static HOOK_LOCK: StaticRWLock = StaticRWLock::new();
static mut HOOK: Hook = Hook::Default;
/// Registers a custom panic hook, replacing any that was previously registered.
}
unsafe {
- HOOK_LOCK.write();
+ let guard = HOOK_LOCK.write();
let old_hook = HOOK;
HOOK = Hook::Custom(Box::into_raw(hook));
- HOOK_LOCK.write_unlock();
+ drop(guard);
if let Hook::Custom(ptr) = old_hook {
#[allow(unused_must_use)]
}
unsafe {
- HOOK_LOCK.write();
+ let guard = HOOK_LOCK.write();
let hook = HOOK;
HOOK = Hook::Default;
- HOOK_LOCK.write_unlock();
+ drop(guard);
match hook {
Hook::Default => Box::new(default_hook),
unsafe {
let mut info = PanicInfo::internal_constructor(message, location);
- HOOK_LOCK.read();
+ let _guard = HOOK_LOCK.read();
match HOOK {
// Some platforms (like wasm) know that printing to stderr won't ever actually
// print anything, and if that's the case we can skip the default
(*ptr)(&info);
}
};
- HOOK_LOCK.read_unlock();
}
if panics > 1 {