2016-01-23 07:49:57 +00:00
|
|
|
#![cfg_attr(test, allow(dead_code))]
|
|
|
|
|
2019-02-10 19:23:21 +00:00
|
|
|
use crate::sys::c;
|
2021-04-29 14:05:10 +00:00
|
|
|
use crate::thread;
|
2014-11-24 03:21:17 +00:00
|
|
|
|
2024-04-02 19:37:21 +00:00
|
|
|
/// Reserve stack space for use in stack overflow exceptions.
|
|
|
|
pub unsafe fn reserve_stack() {
|
|
|
|
let result = c::SetThreadStackGuarantee(&mut 0x5000);
|
2024-04-04 10:48:11 +00:00
|
|
|
// Reserving stack space is not critical so we allow it to fail in the released build of libstd.
|
|
|
|
// We still use debug assert here so that CI will test that we haven't made a mistake calling the function.
|
2024-04-02 19:37:21 +00:00
|
|
|
debug_assert_ne!(result, 0, "failed to reserve stack space for exception handling");
|
2014-11-24 03:21:17 +00:00
|
|
|
}
|
|
|
|
|
2024-07-14 06:43:43 +00:00
|
|
|
unsafe extern "system" fn vectored_handler(ExceptionInfo: *mut c::EXCEPTION_POINTERS) -> i32 {
|
2014-11-24 03:21:17 +00:00
|
|
|
unsafe {
|
|
|
|
let rec = &(*(*ExceptionInfo).ExceptionRecord);
|
|
|
|
let code = rec.ExceptionCode;
|
|
|
|
|
2015-07-27 20:41:35 +00:00
|
|
|
if code == c::EXCEPTION_STACK_OVERFLOW {
|
2021-05-06 12:03:50 +00:00
|
|
|
rtprintpanic!(
|
2021-04-29 14:05:10 +00:00
|
|
|
"\nthread '{}' has overflowed its stack\n",
|
|
|
|
thread::current().name().unwrap_or("<unknown>")
|
|
|
|
);
|
2014-11-24 03:21:17 +00:00
|
|
|
}
|
2015-07-27 20:41:35 +00:00
|
|
|
c::EXCEPTION_CONTINUE_SEARCH
|
2014-11-24 03:21:17 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pub unsafe fn init() {
|
2024-04-02 19:37:21 +00:00
|
|
|
let result = c::AddVectoredExceptionHandler(0, Some(vectored_handler));
|
2024-04-04 10:48:11 +00:00
|
|
|
// Similar to the above, adding the stack overflow handler is allowed to fail
|
|
|
|
// but a debug assert is used so CI will still test that it normally works.
|
2024-04-02 19:37:21 +00:00
|
|
|
debug_assert!(!result.is_null(), "failed to install exception handler");
|
2015-07-27 20:41:35 +00:00
|
|
|
// Set the thread stack guarantee for the main thread.
|
2024-04-02 19:37:21 +00:00
|
|
|
reserve_stack();
|
2014-11-24 03:21:17 +00:00
|
|
|
}
|