about summary refs log tree commit diff
path: root/library/std/src/sys/pal/windows/stack_overflow.rs
diff options
context:
space:
mode:
authorjoboet <jonasboettiger@icloud.com>2024-01-11 20:10:25 +0100
committerjoboet <jonasboettiger@icloud.com>2024-01-11 20:10:25 +0100
commit99128b7e45f8b95d962da2e6ea584767f0c85455 (patch)
tree20874cb2d8526a427342c32a45bc63a21022499c /library/std/src/sys/pal/windows/stack_overflow.rs
parent062e7c6a951c1e4f33c0a6f6761755949cde15ec (diff)
downloadrust-99128b7e45f8b95d962da2e6ea584767f0c85455.tar.gz
rust-99128b7e45f8b95d962da2e6ea584767f0c85455.zip
std: begin moving platform support modules into `pal`
Diffstat (limited to 'library/std/src/sys/pal/windows/stack_overflow.rs')
-rw-r--r--library/std/src/sys/pal/windows/stack_overflow.rs44
1 files changed, 44 insertions, 0 deletions
diff --git a/library/std/src/sys/pal/windows/stack_overflow.rs b/library/std/src/sys/pal/windows/stack_overflow.rs
new file mode 100644
index 00000000000..627763da856
--- /dev/null
+++ b/library/std/src/sys/pal/windows/stack_overflow.rs
@@ -0,0 +1,44 @@
+#![cfg_attr(test, allow(dead_code))]
+
+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
+    }
+}
+
+unsafe 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 {
+            rtprintpanic!(
+                "\nthread '{}' has overflowed its stack\n",
+                thread::current().name().unwrap_or("<unknown>")
+            );
+        }
+        c::EXCEPTION_CONTINUE_SEARCH
+    }
+}
+
+pub unsafe fn init() {
+    if c::AddVectoredExceptionHandler(0, Some(vectored_handler)).is_null() {
+        panic!("failed to install exception handler");
+    }
+    // Set the thread stack guarantee for the main thread.
+    let _h = Handler::new();
+}