diff options
| author | Joshua Sheard <mail@jsheard.com> | 2017-09-06 20:40:34 +0100 |
|---|---|---|
| committer | Joshua Sheard <mail@jsheard.com> | 2017-09-06 20:40:34 +0100 |
| commit | 8e80cee144f1a75ab902c3b64e58979b140b9f52 (patch) | |
| tree | ea4141f54837d2de8f3f96cc72ffac9ecca4c634 /src/libstd/sys | |
| parent | a20953906056f85f71896795e762ac242e1891aa (diff) | |
| download | rust-8e80cee144f1a75ab902c3b64e58979b140b9f52.tar.gz rust-8e80cee144f1a75ab902c3b64e58979b140b9f52.zip | |
Implement named threads on Windows
Diffstat (limited to 'src/libstd/sys')
| -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 2cdd86e88b0..4043f6bc738 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 struct Thread { handle: Handle } @@ -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) { |
