diff options
| author | Vojtech Kral <vojtech@kral.hk> | 2015-01-28 13:48:27 +0100 |
|---|---|---|
| committer | Vojtech Kral <vojtech@kral.hk> | 2015-01-28 13:48:27 +0100 |
| commit | 33a3d6d88f76bfae770983ee50e36e23cc4c7655 (patch) | |
| tree | ec8874adf445589951286bc64619d27462c3709d /src/libstd/sys | |
| parent | c155208de42de5761231726e35614b4499b5a137 (diff) | |
| download | rust-33a3d6d88f76bfae770983ee50e36e23cc4c7655.tar.gz rust-33a3d6d88f76bfae770983ee50e36e23cc4c7655.zip | |
Thread native name setting, fix #10302
Diffstat (limited to 'src/libstd/sys')
| -rw-r--r-- | src/libstd/sys/common/thread_info.rs | 4 | ||||
| -rw-r--r-- | src/libstd/sys/unix/thread.rs | 29 |
2 files changed, 18 insertions, 15 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 { |
