Implement named threads on Windows

This commit is contained in:
Joshua Sheard 2017-09-06 20:40:34 +01:00
parent a209539060
commit 8e80cee144
2 changed files with 17 additions and 7 deletions

View file

@ -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,

View file

@ -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) {