Rename panic handlers to panic hook
This commit is contained in:
@@ -23,7 +23,21 @@ use sync::{Arc, Mutex, RwLock};
|
|||||||
use sys_common::unwind;
|
use sys_common::unwind;
|
||||||
use thread::Result;
|
use thread::Result;
|
||||||
|
|
||||||
pub use panicking::{take_handler, set_handler, PanicInfo, Location};
|
pub use panicking::{take_hook, set_hook, PanicInfo, Location};
|
||||||
|
|
||||||
|
///
|
||||||
|
#[rustc_deprecated(since = "1.9.0", reason = "renamed to set_hook")]
|
||||||
|
#[unstable(feature = "panic_handler", reason = "awaiting feedback", issue = "30449")]
|
||||||
|
pub fn set_handler<F>(handler: F) where F: Fn(&PanicInfo) + 'static + Sync + Send {
|
||||||
|
set_hook(handler)
|
||||||
|
}
|
||||||
|
|
||||||
|
///
|
||||||
|
#[rustc_deprecated(since = "1.9.0", reason = "renamed to take_hook")]
|
||||||
|
#[unstable(feature = "panic_handler", reason = "awaiting feedback", issue = "30449")]
|
||||||
|
pub fn take_handler() -> Box<Fn(&PanicInfo) + 'static + Sync + Send> {
|
||||||
|
take_hook()
|
||||||
|
}
|
||||||
|
|
||||||
/// A marker trait which represents "panic safe" types in Rust.
|
/// A marker trait which represents "panic safe" types in Rust.
|
||||||
///
|
///
|
||||||
|
|||||||
@@ -32,73 +32,72 @@ thread_local! {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Copy, Clone)]
|
#[derive(Copy, Clone)]
|
||||||
enum Handler {
|
enum Hook {
|
||||||
Default,
|
Default,
|
||||||
Custom(*mut (Fn(&PanicInfo) + 'static + Sync + Send)),
|
Custom(*mut (Fn(&PanicInfo) + 'static + Sync + Send)),
|
||||||
}
|
}
|
||||||
|
|
||||||
static HANDLER_LOCK: StaticRwLock = StaticRwLock::new();
|
static HOOK_LOCK: StaticRwLock = StaticRwLock::new();
|
||||||
static mut HANDLER: Handler = Handler::Default;
|
static mut HOOK: Hook = Hook::Default;
|
||||||
static FIRST_PANIC: AtomicBool = AtomicBool::new(true);
|
static FIRST_PANIC: AtomicBool = AtomicBool::new(true);
|
||||||
|
|
||||||
/// Registers a custom panic handler, replacing any that was previously
|
/// Registers a custom panic hook, replacing any that was previously registered.
|
||||||
/// registered.
|
|
||||||
///
|
///
|
||||||
/// The panic handler is invoked when a thread panics, but before it begins
|
/// The panic hook is invoked when a thread panics, but before it begins
|
||||||
/// unwinding the stack. The default handler prints a message to standard error
|
/// unwinding the stack. The default hook prints a message to standard error
|
||||||
/// and generates a backtrace if requested, but this behavior can be customized
|
/// and generates a backtrace if requested, but this behavior can be customized
|
||||||
/// with the `set_handler` and `take_handler` functions.
|
/// with the `set_hook` and `take_hook` functions.
|
||||||
///
|
///
|
||||||
/// The handler is provided with a `PanicInfo` struct which contains information
|
/// The hook is provided with a `PanicInfo` struct which contains information
|
||||||
/// about the origin of the panic, including the payload passed to `panic!` and
|
/// about the origin of the panic, including the payload passed to `panic!` and
|
||||||
/// the source code location from which the panic originated.
|
/// the source code location from which the panic originated.
|
||||||
///
|
///
|
||||||
/// The panic handler is a global resource.
|
/// The panic hook is a global resource.
|
||||||
///
|
///
|
||||||
/// # Panics
|
/// # Panics
|
||||||
///
|
///
|
||||||
/// Panics if called from a panicking thread.
|
/// Panics if called from a panicking thread.
|
||||||
#[unstable(feature = "panic_handler", reason = "awaiting feedback", issue = "30449")]
|
#[unstable(feature = "panic_handler", reason = "awaiting feedback", issue = "30449")]
|
||||||
pub fn set_handler<F>(handler: F) where F: Fn(&PanicInfo) + 'static + Sync + Send {
|
pub fn set_hook<F>(hook: F) where F: Fn(&PanicInfo) + 'static + Sync + Send {
|
||||||
if thread::panicking() {
|
if thread::panicking() {
|
||||||
panic!("cannot modify the panic handler from a panicking thread");
|
panic!("cannot modify the panic hook from a panicking thread");
|
||||||
}
|
}
|
||||||
|
|
||||||
let handler = Box::new(handler);
|
let hook = Box::new(hook);
|
||||||
unsafe {
|
unsafe {
|
||||||
let lock = HANDLER_LOCK.write();
|
let lock = HOOK_LOCK.write();
|
||||||
let old_handler = HANDLER;
|
let old_hook = HOOK;
|
||||||
HANDLER = Handler::Custom(Box::into_raw(handler));
|
HOOK = Hook::Custom(Box::into_raw(hook));
|
||||||
drop(lock);
|
drop(lock);
|
||||||
|
|
||||||
if let Handler::Custom(ptr) = old_handler {
|
if let Hook::Custom(ptr) = old_hook {
|
||||||
Box::from_raw(ptr);
|
Box::from_raw(ptr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Unregisters the current panic handler, returning it.
|
/// Unregisters the current panic hook, returning it.
|
||||||
///
|
///
|
||||||
/// If no custom handler is registered, the default handler will be returned.
|
/// If no custom hook is registered, the default hook will be returned.
|
||||||
///
|
///
|
||||||
/// # Panics
|
/// # Panics
|
||||||
///
|
///
|
||||||
/// Panics if called from a panicking thread.
|
/// Panics if called from a panicking thread.
|
||||||
#[unstable(feature = "panic_handler", reason = "awaiting feedback", issue = "30449")]
|
#[unstable(feature = "panic_handler", reason = "awaiting feedback", issue = "30449")]
|
||||||
pub fn take_handler() -> Box<Fn(&PanicInfo) + 'static + Sync + Send> {
|
pub fn take_hook() -> Box<Fn(&PanicInfo) + 'static + Sync + Send> {
|
||||||
if thread::panicking() {
|
if thread::panicking() {
|
||||||
panic!("cannot modify the panic handler from a panicking thread");
|
panic!("cannot modify the panic hook from a panicking thread");
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe {
|
unsafe {
|
||||||
let lock = HANDLER_LOCK.write();
|
let lock = HOOK_LOCK.write();
|
||||||
let handler = HANDLER;
|
let hook = HOOK;
|
||||||
HANDLER = Handler::Default;
|
HOOK = Hook::Default;
|
||||||
drop(lock);
|
drop(lock);
|
||||||
|
|
||||||
match handler {
|
match hook {
|
||||||
Handler::Default => Box::new(default_handler),
|
Hook::Default => Box::new(default_hook),
|
||||||
Handler::Custom(ptr) => {Box::from_raw(ptr)} // FIXME #30530
|
Hook::Custom(ptr) => {Box::from_raw(ptr)} // FIXME #30530
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -151,7 +150,7 @@ impl<'a> Location<'a> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn default_handler(info: &PanicInfo) {
|
fn default_hook(info: &PanicInfo) {
|
||||||
let panics = PANIC_COUNT.with(|s| s.get());
|
let panics = PANIC_COUNT.with(|s| s.get());
|
||||||
|
|
||||||
// If this is a double panic, make sure that we print a backtrace
|
// If this is a double panic, make sure that we print a backtrace
|
||||||
@@ -224,10 +223,10 @@ pub fn on_panic(obj: &(Any+Send), file: &'static str, line: u32) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
unsafe {
|
unsafe {
|
||||||
let _lock = HANDLER_LOCK.read();
|
let _lock = HOOK_LOCK.read();
|
||||||
match HANDLER {
|
match HOOK {
|
||||||
Handler::Default => default_handler(&info),
|
Hook::Default => default_hook(&info),
|
||||||
Handler::Custom(ptr) => (*ptr)(&info),
|
Hook::Custom(ptr) => (*ptr)(&info),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user