about summary refs log tree commit diff
path: root/src/libstd
diff options
context:
space:
mode:
authorVojtech Kral <vojtech@kral.hk>2015-01-28 13:48:27 +0100
committerVojtech Kral <vojtech@kral.hk>2015-01-28 13:48:27 +0100
commit33a3d6d88f76bfae770983ee50e36e23cc4c7655 (patch)
treeec8874adf445589951286bc64619d27462c3709d /src/libstd
parentc155208de42de5761231726e35614b4499b5a137 (diff)
downloadrust-33a3d6d88f76bfae770983ee50e36e23cc4c7655.tar.gz
rust-33a3d6d88f76bfae770983ee50e36e23cc4c7655.zip
Thread native name setting, fix #10302
Diffstat (limited to 'src/libstd')
-rw-r--r--src/libstd/sys/common/thread_info.rs4
-rw-r--r--src/libstd/sys/unix/thread.rs29
-rw-r--r--src/libstd/thread.rs4
3 files changed, 18 insertions, 19 deletions
diff --git a/src/libstd/sys/common/thread_info.rs b/src/libstd/sys/common/thread_info.rs
index 92b936e74f6..7c9758ca924 100644
--- a/src/libstd/sys/common/thread_info.rs
+++ b/src/libstd/sys/common/thread_info.rs
@@ -56,6 +56,10 @@ pub fn stack_guard() -> uint {
 
 pub fn set(stack_bounds: (uint, uint), stack_guard: uint, thread: Thread) {
     THREAD_INFO.with(|c| assert!(c.borrow().is_none()));
+    match thread.name() {
+        Some(name) => unsafe { ::sys::thread::set_name(name.as_slice()); },
+        None => {}
+    }
     THREAD_INFO.with(move |c| *c.borrow_mut() = Some(ThreadInfo{
         stack_bounds: stack_bounds,
         stack_guard: stack_guard,
diff --git a/src/libstd/sys/unix/thread.rs b/src/libstd/sys/unix/thread.rs
index 1fba6bedc7c..59c2badaf62 100644
--- a/src/libstd/sys/unix/thread.rs
+++ b/src/libstd/sys/unix/thread.rs
@@ -209,11 +209,19 @@ pub unsafe fn create(stack: uint, p: Thunk) -> rust_thread {
 
 #[cfg(any(target_os = "linux", target_os = "android"))]
 pub unsafe fn set_name(name: &str) {
-    // Using prctl() rather than pthread_setname_np(),
-    // because pthread_setname_np() wasn't added until glibc 2.12
-    // PR_SET_NAME since Linux 2.6.9
+    // pthread_setname_np() since glibc 2.12
+    // availability autodetected via weak linkage
     let cname = CString::from_slice(name.as_bytes());
-    prctl(15i32 /* = PR_SET_NAME */, cname.as_ptr() as u64, 0u64, 0u64, 0u64);
+    type F = unsafe extern "C" fn(libc::pthread_t, *const libc::c_char) -> libc::c_int;
+    extern {
+        #[linkage = "extern_weak"]
+        static pthread_setname_np: *const ();
+    }
+    if !pthread_setname_np.is_null() {
+        unsafe {
+            mem::transmute::<*const (), F>(pthread_setname_np)(pthread_self(), cname.as_ptr());
+        }
+    }
 }
 
 #[cfg(any(target_os = "freebsd", target_os = "dragonfly"))]
@@ -270,15 +278,6 @@ fn min_stack_size(_: *const libc::pthread_attr_t) -> libc::size_t {
     PTHREAD_STACK_MIN
 }
 
-#[cfg(any(target_os = "linux", target_os = "android"))]
-extern {
-    fn prctl(option: libc::c_int,
-        arg2: libc::c_ulong,
-        arg3: libc::c_ulong,
-        arg4: libc::c_ulong,
-        arg5: libc::c_ulong) -> libc::c_int;
-}
-
 #[cfg(any(target_os = "linux"))]
 extern {
     pub fn pthread_self() -> libc::pthread_t;
@@ -294,7 +293,7 @@ extern {
 #[cfg(any(target_os = "freebsd", target_os = "dragonfly"))]
 extern {
     pub fn pthread_self() -> libc::pthread_t;
-    fn pthread_set_name_np(tid: libc::pthread_t, name: *const c_char);
+    fn pthread_set_name_np(tid: libc::pthread_t, name: *const libc::c_char);
 }
 
 #[cfg(target_os = "macos")]
@@ -302,7 +301,7 @@ extern {
     pub fn pthread_self() -> libc::pthread_t;
     pub fn pthread_get_stackaddr_np(thread: libc::pthread_t) -> *mut libc::c_void;
     pub fn pthread_get_stacksize_np(thread: libc::pthread_t) -> libc::size_t;
-    fn pthread_setname_np(name: *const c_char) -> libc::c_int;
+    fn pthread_setname_np(name: *const libc::c_char) -> libc::c_int;
 }
 
 extern {
diff --git a/src/libstd/thread.rs b/src/libstd/thread.rs
index 0cab7e69928..a86b82b8c62 100644
--- a/src/libstd/thread.rs
+++ b/src/libstd/thread.rs
@@ -275,10 +275,6 @@ impl Builder {
             unsafe {
                 stack::record_os_managed_stack_bounds(my_stack_bottom, my_stack_top);
             }
-            match their_thread.name() {
-                Some(thename) => unsafe { imp::set_name(thename.as_slice()); },
-                None => {}
-            }
             thread_info::set(
                 (my_stack_bottom, my_stack_top),
                 unsafe { imp::guard::current() },