blob: c863ac670b6d500f04b152fb79e433975a4697c3 [file] [log] [blame]
//@only-target-windows: this directly tests windows-only functions
use std::ffi::OsStr;
use std::os::windows::ffi::OsStrExt;
use core::ffi::c_void;
type HANDLE = *mut c_void;
type PWSTR = *mut u16;
type PCWSTR = *const u16;
type HRESULT = i32;
type HLOCAL = *mut ::core::ffi::c_void;
extern "system" {
fn GetCurrentThread() -> HANDLE;
fn GetThreadDescription(hthread: HANDLE, lpthreaddescription: *mut PWSTR) -> HRESULT;
fn SetThreadDescription(hthread: HANDLE, lpthreaddescription: PCWSTR) -> HRESULT;
fn LocalFree(hmem: HLOCAL) -> HLOCAL;
}
fn to_u16s<S: AsRef<OsStr>>(s: S) -> Vec<u16> {
let mut result: Vec<_> = s.as_ref().encode_wide().collect();
result.push(0);
result
}
fn main() {
unsafe {
let name = c"mythreadname";
let utf16 = to_u16s(name.to_str().unwrap());
SetThreadDescription(GetCurrentThread(), utf16.as_ptr());
let mut ptr = core::ptr::null_mut::<u16>();
let result = GetThreadDescription(GetCurrentThread(), &mut ptr);
assert!(result >= 0);
let name_gotten = String::from_utf16_lossy({
let mut len = 0;
while *ptr.add(len) != 0 {
len += 1;
}
core::slice::from_raw_parts(ptr, len)
});
assert_eq!(name_gotten, name.to_str().unwrap());
let r = LocalFree(ptr.cast());
assert!(r.is_null());
}
}