stack_overflow.rs.html -- source
Description: Source to the Rust file `src\libstd\sys\windows\stack_overflow.rs`.
Keywords: rust, rustlang, rust-lang

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41

    #![cfg_attr(test, allow(dead_code))]

    use crate::sys::c;
    use crate::sys_common::util::report_overflow;

    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 {
                if c::GetLastError() as u32 != c::ERROR_CALL_NOT_IMPLEMENTED as u32 {
                    panic!("failed to reserve stack space for exception handling");
                }
            }
            Handler
        }
    }

    extern "system" fn vectored_handler(ExceptionInfo: *mut c::EXCEPTION_POINTERS) -> c::LONG {
        unsafe {
            let rec = &(*(*ExceptionInfo).ExceptionRecord);
            let code = rec.ExceptionCode;

            if code == c::EXCEPTION_STACK_OVERFLOW {
                report_overflow();
            }
            c::EXCEPTION_CONTINUE_SEARCH
        }
    }

    pub unsafe fn init() {
        if c::AddVectoredExceptionHandler(0, vectored_handler).is_null() {
            panic!("failed to install exception handler");
        }
        // Set the thread stack guarantee for the main thread.
        let _h = Handler::new();
    }

    pub unsafe fn cleanup() {}