about summary refs log tree commit diff
path: root/src/libstd/sys/unix/stack_overflow.rs
diff options
context:
space:
mode:
authorDave Huseby <dhuseby@mozilla.com>2016-01-26 17:37:18 -0800
committerDave Huseby <dhuseby@mozilla.com>2016-02-02 21:42:11 -0800
commit0153e64d975ec175f893ad528311ef7c441a1561 (patch)
tree077f0a232b2b2476c5373c8f9b009d6d431e8a10 /src/libstd/sys/unix/stack_overflow.rs
parent50df6b9dc5144df09ef6b8519afd3657abdab03f (diff)
downloadrust-0153e64d975ec175f893ad528311ef7c441a1561.tar.gz
rust-0153e64d975ec175f893ad528311ef7c441a1561.zip
Fixes #31229
Diffstat (limited to 'src/libstd/sys/unix/stack_overflow.rs')
-rw-r--r--src/libstd/sys/unix/stack_overflow.rs43
1 files changed, 34 insertions, 9 deletions
diff --git a/src/libstd/sys/unix/stack_overflow.rs b/src/libstd/sys/unix/stack_overflow.rs
index c7614db3299..88ac73de2fb 100644
--- a/src/libstd/sys/unix/stack_overflow.rs
+++ b/src/libstd/sys/unix/stack_overflow.rs
@@ -135,17 +135,42 @@ mod imp {
         Handler { _data: MAIN_ALTSTACK };
     }
 
-    pub unsafe fn make_handler() -> Handler {
-        let alt_stack = mmap(ptr::null_mut(),
-                             SIGSTKSZ,
-                             PROT_READ | PROT_WRITE,
-                             MAP_PRIVATE | MAP_ANON,
-                             -1,
-                             0);
-        if alt_stack == MAP_FAILED {
+    #[cfg(any(target_os = "linux",
+              target_os = "macos",
+              target_os = "bitrig",
+              target_os = "netbsd",
+              target_os = "openbsd"))]
+    unsafe fn get_stack() -> *mut libc::c_void {
+        let stack = mmap(ptr::null_mut(),
+                         SIGSTKSZ,
+                         PROT_READ | PROT_WRITE,
+                         MAP_PRIVATE | MAP_ANON,
+                         -1,
+                         0);
+        if stack == MAP_FAILED {
+            panic!("failed to allocate an alternative stack");
+        }
+        stack
+    }
+
+    #[cfg(any(target_os = "dragonfly",
+              target_os = "freebsd"))]
+    unsafe fn get_stack() -> *mut i8 {
+        let stack = mmap(ptr::null_mut(),
+                         SIGSTKSZ,
+                         PROT_READ | PROT_WRITE,
+                         MAP_PRIVATE | MAP_ANON,
+                         -1,
+                         0);
+        if stack == MAP_FAILED {
             panic!("failed to allocate an alternative stack");
         }
+        stack as *mut i8
+    }
 
+
+    pub unsafe fn make_handler() -> Handler {
+        let alt_stack = get_stack();
         let mut stack: libc::stack_t = mem::zeroed();
 
         stack.ss_sp = alt_stack;
@@ -154,7 +179,7 @@ mod imp {
 
         sigaltstack(&stack, ptr::null_mut());
 
-        Handler { _data: alt_stack }
+        Handler { _data: alt_stack as *mut libc::c_void }
     }
 
     pub unsafe fn drop_handler(handler: &mut Handler) {