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-02-02 18:21:39 -0800
committerDave Huseby <dhuseby@mozilla.com>2016-02-02 21:42:11 -0800
commitca6f9203461f57a1f1a88266efeb61a5aa47d66b (patch)
tree6c680499f3822c50f9e900b2acc079bf4ca0f0b1 /src/libstd/sys/unix/stack_overflow.rs
parent68bfd43eefe42b429a463731fe81d62bf9c27907 (diff)
downloadrust-ca6f9203461f57a1f1a88266efeb61a5aa47d66b.tar.gz
rust-ca6f9203461f57a1f1a88266efeb61a5aa47d66b.zip
trying again at fixing stackp initialization
Diffstat (limited to 'src/libstd/sys/unix/stack_overflow.rs')
-rw-r--r--src/libstd/sys/unix/stack_overflow.rs21
1 files changed, 18 insertions, 3 deletions
diff --git a/src/libstd/sys/unix/stack_overflow.rs b/src/libstd/sys/unix/stack_overflow.rs
index ee590e1af71..b5cbcaa44d5 100644
--- a/src/libstd/sys/unix/stack_overflow.rs
+++ b/src/libstd/sys/unix/stack_overflow.rs
@@ -135,7 +135,7 @@ mod imp {
         Handler { _data: MAIN_ALTSTACK };
     }
 
-    unsafe fn get_stack() -> *mut i8 {
+    unsafe fn get_stackp() -> *mut libc::c_void {
         let stackp = mmap(ptr::null_mut(),
                           SIGSTKSZ,
                           PROT_READ | PROT_WRITE,
@@ -145,11 +145,26 @@ mod imp {
         if stackp == MAP_FAILED {
             panic!("failed to allocate an alternative stack");
         }
-        stackp as *mut i8
+        stackp
+    }
+
+    #[cfg(any(target_os = "linux",
+              target_os = "macos",
+              target_os = "bitrig",
+              target_os = "netbsd",
+              target_os = "openbsd"))]
+    unsafe fn get_stack() -> libc::stack_t {
+        libc::stack_t { ss_sp: get_stackp(), ss_flags: 0, ss_size: SIGSTKSZ }
+    }
+
+    #[cfg(any(target_os = "freebsd",
+              target_os = "dragonfly"))]
+    unsafe fn get_stack() -> libc::stack_t {
+        libc::stack_t { ss_sp: get_stackp() as *mut i8, ss_flags: 0, ss_size: SIGSTKSZ }
     }
 
     pub unsafe fn make_handler() -> Handler {
-        let stack = libc::stack_t { ss_sp: get_stack(), ss_flags: 0, ss_size: SIGSTKSZ }
+        let stack = get_stack();
         sigaltstack(&stack, ptr::null_mut());
         Handler { _data: stack.ss_sp as *mut libc::c_void }
     }