about summary refs log tree commit diff
path: root/src/libstd
diff options
context:
space:
mode:
authorAlan Somers <asomers@gmail.com>2016-04-05 03:25:32 +0000
committerAlan Somers <asomers@gmail.com>2016-04-05 03:25:32 +0000
commit112463a3b1b1fc30c8f407e50e9ef692034ccb37 (patch)
tree675f22d1c5bee1abf76d47bc9235c07a582bf6fd /src/libstd
parentabc3777c06abced90b415b920082a4814d9051d7 (diff)
downloadrust-112463a3b1b1fc30c8f407e50e9ef692034ccb37.tar.gz
rust-112463a3b1b1fc30c8f407e50e9ef692034ccb37.zip
Reduce code duplication in thread.rs
Diffstat (limited to 'src/libstd')
-rw-r--r--src/libstd/sys/unix/thread.rs60
1 files changed, 18 insertions, 42 deletions
diff --git a/src/libstd/sys/unix/thread.rs b/src/libstd/sys/unix/thread.rs
index 0f238d5c11c..4b0201cfd01 100644
--- a/src/libstd/sys/unix/thread.rs
+++ b/src/libstd/sys/unix/thread.rs
@@ -201,28 +201,17 @@ pub mod guard {
         current().map(|s| s as *mut libc::c_void)
     }
 
-    #[cfg(target_os = "freebsd")]
+    #[cfg(any(target_os = "android", target_os = "freebsd",
+              target_os = "linux", target_os = "netbsd"))]
     unsafe fn get_stack_start() -> Option<*mut libc::c_void> {
         let mut ret = None;
         let mut attr: libc::pthread_attr_t = ::mem::zeroed();
         assert_eq!(libc::pthread_attr_init(&mut attr), 0);
-        if libc::pthread_attr_get_np(libc::pthread_self(), &mut attr) == 0 {
-            let mut stackaddr = ::ptr::null_mut();
-            let mut stacksize = 0;
-            assert_eq!(libc::pthread_attr_getstack(&attr, &mut stackaddr,
-                                                   &mut stacksize), 0);
-            ret = Some(stackaddr);
-        }
-        assert_eq!(libc::pthread_attr_destroy(&mut attr), 0);
-        ret
-    }
-
-    #[cfg(any(target_os = "linux", target_os = "android", target_os = "netbsd"))]
-    unsafe fn get_stack_start() -> Option<*mut libc::c_void> {
-        let mut ret = None;
-        let mut attr: libc::pthread_attr_t = ::mem::zeroed();
-        assert_eq!(libc::pthread_attr_init(&mut attr), 0);
-        if libc::pthread_getattr_np(libc::pthread_self(), &mut attr) == 0 {
+        #[cfg(target_os = "freebsd")]
+            let e = libc::pthread_attr_get_np(libc::pthread_self(), &mut attr);
+        #[cfg(not(target_os = "freebsd"))]
+            let e = libc::pthread_getattr_np(libc::pthread_self(), &mut attr);
+        if e == 0 {
             let mut stackaddr = ::ptr::null_mut();
             let mut stacksize = 0;
             assert_eq!(libc::pthread_attr_getstack(&attr, &mut stackaddr,
@@ -304,33 +293,18 @@ pub mod guard {
         })
     }
 
-    #[cfg(target_os = "freebsd")]
-    pub unsafe fn current() -> Option<usize> {
-        let mut ret = None;
-        let mut attr: libc::pthread_attr_t = ::mem::zeroed();
-        assert_eq!(libc::pthread_attr_init(&mut attr), 0);
-        if libc::pthread_attr_get_np(libc::pthread_self(), &mut attr) == 0 {
-            let mut guardsize = 0;
-            assert_eq!(libc::pthread_attr_getguardsize(&attr, &mut guardsize), 0);
-            if guardsize == 0 {
-                panic!("there is no guard page");
-            }
-            let mut stackaddr = ::ptr::null_mut();
-            let mut size = 0;
-            assert_eq!(libc::pthread_attr_getstack(&attr, &mut stackaddr,
-                                                   &mut size), 0);
-            ret = Some(stackaddr as usize - guardsize as usize);
-        }
-        assert_eq!(libc::pthread_attr_destroy(&mut attr), 0);
-        ret
-    }
-
-    #[cfg(any(target_os = "linux", target_os = "android", target_os = "netbsd"))]
+    #[cfg(any(target_os = "android", target_os = "freebsd",
+              target_os = "linux", target_os = "netbsd"))]
     pub unsafe fn current() -> Option<usize> {
         let mut ret = None;
         let mut attr: libc::pthread_attr_t = ::mem::zeroed();
         assert_eq!(libc::pthread_attr_init(&mut attr), 0);
-        if libc::pthread_getattr_np(libc::pthread_self(), &mut attr) == 0 {
+        #[cfg(target_os = "freebsd")]
+            let e = libc::pthread_attr_get_np(libc::pthread_self(), &mut attr);
+        #[cfg(not(target_os = "freebsd"))]
+            let e = libc::pthread_getattr_np(libc::pthread_self(), &mut attr);
+        if e == 0 {
+        //if libc::pthread_getattr_np(libc::pthread_self(), &mut attr) == 0 {
             let mut guardsize = 0;
             assert_eq!(libc::pthread_attr_getguardsize(&attr, &mut guardsize), 0);
             if guardsize == 0 {
@@ -341,7 +315,9 @@ pub mod guard {
             assert_eq!(libc::pthread_attr_getstack(&attr, &mut stackaddr,
                                                    &mut size), 0);
 
-            ret = if cfg!(target_os = "netbsd") {
+            ret = if cfg!(target_os = "freebsd") {
+                Some(stackaddr as usize - guardsize as usize)
+            } else if cfg!(target_os = "netbsd") {
                 Some(stackaddr as usize)
             } else {
                 Some(stackaddr as usize + guardsize as usize)