mirror of https://github.com/rust-lang/rust.git
Avoid panicking unnecessarily on startup
This commit is contained in:
parent
029cb1b13b
commit
e457b77e2a
|
@ -3,21 +3,10 @@
|
|||
use crate::sys::c;
|
||||
use crate::thread;
|
||||
|
||||
use super::api;
|
||||
|
||||
pub struct Handler;
|
||||
|
||||
impl Handler {
|
||||
pub unsafe fn new() -> Handler {
|
||||
// This API isn't available on XP, so don't panic in that case and just
|
||||
// pray it works out ok.
|
||||
if c::SetThreadStackGuarantee(&mut 0x5000) == 0
|
||||
&& api::get_last_error().code != c::ERROR_CALL_NOT_IMPLEMENTED
|
||||
{
|
||||
panic!("failed to reserve stack space for exception handling");
|
||||
}
|
||||
Handler
|
||||
}
|
||||
/// Reserve stack space for use in stack overflow exceptions.
|
||||
pub unsafe fn reserve_stack() {
|
||||
let result = c::SetThreadStackGuarantee(&mut 0x5000);
|
||||
debug_assert_ne!(result, 0, "failed to reserve stack space for exception handling");
|
||||
}
|
||||
|
||||
unsafe extern "system" fn vectored_handler(ExceptionInfo: *mut c::EXCEPTION_POINTERS) -> c::LONG {
|
||||
|
@ -36,9 +25,8 @@ unsafe extern "system" fn vectored_handler(ExceptionInfo: *mut c::EXCEPTION_POIN
|
|||
}
|
||||
|
||||
pub unsafe fn init() {
|
||||
if c::AddVectoredExceptionHandler(0, Some(vectored_handler)).is_null() {
|
||||
panic!("failed to install exception handler");
|
||||
}
|
||||
let result = c::AddVectoredExceptionHandler(0, Some(vectored_handler));
|
||||
debug_assert!(!result.is_null(), "failed to install exception handler");
|
||||
// Set the thread stack guarantee for the main thread.
|
||||
let _h = Handler::new();
|
||||
reserve_stack();
|
||||
}
|
||||
|
|
|
@ -1,11 +1,4 @@
|
|||
#![cfg_attr(test, allow(dead_code))]
|
||||
|
||||
pub struct Handler;
|
||||
|
||||
impl Handler {
|
||||
pub fn new() -> Handler {
|
||||
Handler
|
||||
}
|
||||
}
|
||||
|
||||
pub unsafe fn reserve_stack() {}
|
||||
pub unsafe fn init() {}
|
||||
|
|
|
@ -48,9 +48,8 @@ impl Thread {
|
|||
|
||||
extern "system" fn thread_start(main: *mut c_void) -> c::DWORD {
|
||||
unsafe {
|
||||
// Next, set up our stack overflow handler which may get triggered if we run
|
||||
// out of stack.
|
||||
let _handler = stack_overflow::Handler::new();
|
||||
// Next, reserve some stack space for if we otherwise run out of stack.
|
||||
stack_overflow::reserve_stack();
|
||||
// Finally, let's run some code.
|
||||
Box::from_raw(main as *mut Box<dyn FnOnce()>)();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue