Skip to content

Commit

Permalink
Rollup merge of rust-lang#44374 - jsheard:threadname, r=alexcrichton
Browse files Browse the repository at this point in the history
Implement named threads on Windows (v2)

https://msdn.microsoft.com/en-us/library/windows/desktop/mt774976(v=vs.85).aspx

Windows 10 version 1607 finally added a sensible API for naming threads, so we can now implement named threads without having to use MSVC compiler extensions like before. VS2017s debugger and the WPA profiler already use this API where available, but other tools may need some time to catch up.

![thread](https://user-images.githubusercontent.com/3153547/30133438-c92a3cda-934b-11e7-9668-915d53e8d860.png)
  • Loading branch information
GuillaumeGomez committed Sep 13, 2017
2 parents 6a6190f + 8e80cee commit 5faf67b
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 7 deletions.
11 changes: 9 additions & 2 deletions src/libstd/sys/windows/c.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ pub type DWORD = c_ulong;
pub type HANDLE = LPVOID;
pub type HINSTANCE = HANDLE;
pub type HMODULE = HINSTANCE;
pub type HRESULT = LONG;
pub type BOOL = c_int;
pub type BYTE = u8;
pub type BOOLEAN = BYTE;
Expand Down Expand Up @@ -197,6 +198,8 @@ pub const ERROR_OPERATION_ABORTED: DWORD = 995;
pub const ERROR_IO_PENDING: DWORD = 997;
pub const ERROR_TIMEOUT: DWORD = 0x5B4;

pub const E_NOTIMPL: HRESULT = 0x80004001u32 as HRESULT;

pub const INVALID_HANDLE_VALUE: HANDLE = !0 as HANDLE;

pub const FACILITY_NT_BIT: DWORD = 0x1000_0000;
Expand Down Expand Up @@ -1163,8 +1166,8 @@ extern "system" {
timeout: *const timeval) -> c_int;
}

// Functions that aren't available on Windows XP, but we still use them and just
// provide some form of a fallback implementation.
// Functions that aren't available on every version of Windows that we support,
// but we still use them and just provide some form of a fallback implementation.
compat_fn! {
kernel32:

Expand All @@ -1182,6 +1185,10 @@ compat_fn! {
pub fn SetThreadStackGuarantee(_size: *mut c_ulong) -> BOOL {
SetLastError(ERROR_CALL_NOT_IMPLEMENTED as DWORD); 0
}
pub fn SetThreadDescription(hThread: HANDLE,
lpThreadDescription: LPCWSTR) -> HRESULT {
SetLastError(ERROR_CALL_NOT_IMPLEMENTED as DWORD); E_NOTIMPL
}
pub fn SetFileInformationByHandle(_hFile: HANDLE,
_FileInformationClass: FILE_INFO_BY_HANDLE_CLASS,
_lpFileInformation: LPVOID,
Expand Down
13 changes: 8 additions & 5 deletions src/libstd/sys/windows/thread.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ use sys::handle::Handle;
use sys_common::thread::*;
use time::Duration;

use super::to_u16s;

pub struct Thread {
handle: Handle
}
Expand Down Expand Up @@ -53,11 +55,12 @@ impl Thread {
}
}

pub fn set_name(_name: &CStr) {
// Windows threads are nameless
// The names in MSVC debugger are obtained using a "magic" exception,
// which requires a use of MS C++ extensions.
// See https://msdn.microsoft.com/en-us/library/xcb2z8hs.aspx
pub fn set_name(name: &CStr) {
if let Ok(utf8) = name.to_str() {
if let Ok(utf16) = to_u16s(utf8) {
unsafe { c::SetThreadDescription(c::GetCurrentThread(), utf16.as_ptr()); };
};
};
}

pub fn join(self) {
Expand Down

0 comments on commit 5faf67b

Please sign in to comment.