diff options
| author | Corey Farwell <coreyf@rwell.org> | 2017-09-14 22:32:34 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2017-09-14 22:32:34 -0400 |
| commit | 3ef792a03591235a5d5c9e222161e7246aa3f845 (patch) | |
| tree | add4a0ca09f0eebade1a5b85d2a9ed709f538973 /src/libstd | |
| parent | 9761a8dc14cf38008703ba3370bb7c094d92b550 (diff) | |
| parent | 597ac36547f5b135d55bd4cf26964762c8c4796f (diff) | |
| download | rust-3ef792a03591235a5d5c9e222161e7246aa3f845.tar.gz rust-3ef792a03591235a5d5c9e222161e7246aa3f845.zip | |
Rollup merge of #44374 - jsheard:threadname, r=alexcrichton
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. 
Diffstat (limited to 'src/libstd')
| -rw-r--r-- | src/libstd/sys/windows/c.rs | 11 | ||||
| -rw-r--r-- | src/libstd/sys/windows/thread.rs | 13 |
2 files changed, 17 insertions, 7 deletions
diff --git a/src/libstd/sys/windows/c.rs b/src/libstd/sys/windows/c.rs index 7dfcc996e18..9535ddfe5ca 100644 --- a/src/libstd/sys/windows/c.rs +++ b/src/libstd/sys/windows/c.rs @@ -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; @@ -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; @@ -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: @@ -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, diff --git a/src/libstd/sys/windows/thread.rs b/src/libstd/sys/windows/thread.rs index 6aea9d1fb56..c47baaa2434 100644 --- a/src/libstd/sys/windows/thread.rs +++ b/src/libstd/sys/windows/thread.rs @@ -19,6 +19,8 @@ use sys::handle::Handle; use sys_common::thread::*; use time::Duration; +use super::to_u16s; + pub const DEFAULT_MIN_STACK_SIZE: usize = 2 * 1024 * 1024; pub struct Thread { @@ -55,11 +57,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) { |
