Thread native name setting, fix #10302

This commit is contained in:
Vojtech Kral 2015-01-27 03:38:07 +01:00
parent a637365b10
commit ec4981ece8
3 changed files with 51 additions and 0 deletions

View File

@ -17,6 +17,7 @@ use ptr;
use libc::consts::os::posix01::{PTHREAD_CREATE_JOINABLE, PTHREAD_STACK_MIN};
use libc;
use thunk::Thunk;
use ffi::CString;
use sys_common::stack::RED_ZONE;
use sys_common::thread::*;
@ -206,6 +207,29 @@ pub unsafe fn create(stack: uint, p: Thunk) -> rust_thread {
native
}
#[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
let cname = CString::from_slice(name.as_bytes());
prctl(15i32 /* = PR_SET_NAME */, cname.as_ptr() as u64, 0u64, 0u64, 0u64);
}
#[cfg(any(target_os = "freebsd", target_os = "dragonfly"))]
pub unsafe fn set_name(name: &str) {
// pthread_set_name_np() since almost forever on all BSDs
let cname = CString::from_slice(name.as_bytes());
pthread_set_name_np(pthread_self(), cname.as_ptr());
}
#[cfg(target_os = "macos")]
pub unsafe fn set_name(name: &str) {
// pthread_setname_np() since OS X 10.6
let cname = CString::from_slice(name.as_bytes());
pthread_setname_np(cname.as_ptr());
}
pub unsafe fn join(native: rust_thread) {
assert_eq!(pthread_join(native, ptr::null_mut()), 0);
}
@ -246,6 +270,15 @@ 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;
@ -258,11 +291,18 @@ extern {
stacksize: *mut libc::size_t) -> libc::c_int;
}
#[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);
}
#[cfg(target_os = "macos")]
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;
}
extern {

View File

@ -67,6 +67,13 @@ pub unsafe fn create(stack: uint, p: Thunk) -> rust_thread {
return ret;
}
pub unsafe fn set_name(name: &str) {
// Windows threads are nameless
// The names in MSVC debugger are obtained using a "magic" exception,
// which requires a use of C++ macros.
// See https://msdn.microsoft.com/en-us/library/xcb2z8hs.aspx
}
pub unsafe fn join(native: rust_thread) {
use libc::consts::os::extra::INFINITE;
WaitForSingleObject(native, INFINITE);

View File

@ -275,6 +275,10 @@ 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() },