[Base] Cleanup set thread name.

This commit is contained in:
gibbed 2020-04-13 11:07:18 -05:00 committed by Rick Gibbed
parent ce34e1cbb9
commit 3dc69c6033
3 changed files with 27 additions and 28 deletions

View File

@ -2,7 +2,7 @@
****************************************************************************** ******************************************************************************
* Xenia : Xbox 360 Emulator Research Project * * Xenia : Xbox 360 Emulator Research Project *
****************************************************************************** ******************************************************************************
* Copyright 2014 Ben Vanik. All rights reserved. * * Copyright 2020 Ben Vanik. All rights reserved. *
* Released under the BSD license - see LICENSE in the root for more details. * * Released under the BSD license - see LICENSE in the root for more details. *
****************************************************************************** ******************************************************************************
*/ */
@ -67,9 +67,10 @@ uint32_t current_thread_id();
void set_current_thread_id(uint32_t id); void set_current_thread_id(uint32_t id);
// Sets the current thread name. // Sets the current thread name.
void set_name(const std::string& name); void set_name(const std::string_view name);
// Sets the target thread name. // Sets the target thread name.
void set_name(std::thread::native_handle_type handle, const std::string& name); void set_name(std::thread::native_handle_type handle,
const std::string_view name);
// Yields the current thread to the scheduler. Maybe. // Yields the current thread to the scheduler. Maybe.
void MaybeYield(); void MaybeYield();
@ -358,7 +359,7 @@ class Thread : public WaitHandle {
virtual uint32_t system_id() const = 0; virtual uint32_t system_id() const = 0;
// Returns the current name of the thread, if previously specified. // Returns the current name of the thread, if previously specified.
std::string name() const { return name_; } const std::string& name() const { return name_; }
// Sets the name of the thread, used in debugging and logging. // Sets the name of the thread, used in debugging and logging.
virtual void set_name(std::string name) { name_ = std::move(name); } virtual void set_name(std::string name) { name_ = std::move(name); }

View File

@ -2,7 +2,7 @@
****************************************************************************** ******************************************************************************
* Xenia : Xbox 360 Emulator Research Project * * Xenia : Xbox 360 Emulator Research Project *
****************************************************************************** ******************************************************************************
* Copyright 2014 Ben Vanik. All rights reserved. * * Copyright 2020 Ben Vanik. All rights reserved. *
* Released under the BSD license - see LICENSE in the root for more details. * * Released under the BSD license - see LICENSE in the root for more details. *
****************************************************************************** ******************************************************************************
*/ */
@ -32,13 +32,12 @@ uint32_t current_thread_system_id() {
return static_cast<uint32_t>(syscall(SYS_gettid)); return static_cast<uint32_t>(syscall(SYS_gettid));
} }
void set_name(const std::string& name) { void set_name(std::thread::native_handle_type handle,
pthread_setname_np(pthread_self(), name.c_str()); const std::string_view name) {
pthread_setname_np(handle, std::string(name).c_str());
} }
void set_name(std::thread::native_handle_type handle, const std::string& name) { void set_name(const std::string_view name) { set_name(pthread_self(), name); }
pthread_setname_np(handle, name.c_str());
}
void MaybeYield() { void MaybeYield() {
pthread_yield(); pthread_yield();

View File

@ -2,7 +2,7 @@
****************************************************************************** ******************************************************************************
* Xenia : Xbox 360 Emulator Research Project * * Xenia : Xbox 360 Emulator Research Project *
****************************************************************************** ******************************************************************************
* Copyright 2014 Ben Vanik. All rights reserved. * * Copyright 2020 Ben Vanik. All rights reserved. *
* Released under the BSD license - see LICENSE in the root for more details. * * Released under the BSD license - see LICENSE in the root for more details. *
****************************************************************************** ******************************************************************************
*/ */
@ -41,25 +41,10 @@ struct THREADNAME_INFO {
}; };
#pragma pack(pop) #pragma pack(pop)
void set_name(HANDLE thread, const std::string& name) { void raise_thread_name_exception(HANDLE thread, const std::string& name) {
auto kern = GetModuleHandleW(L"kernel32.dll");
if (kern) {
auto set_thread_description =
(SetThreadDescriptionFn)GetProcAddress(kern, "SetThreadDescription");
if (set_thread_description) {
int len = MultiByteToWideChar(CP_ACP, 0, name.c_str(), -1, NULL, 0);
auto str = (LPWSTR)alloca(len * sizeof(WCHAR));
if (str) {
MultiByteToWideChar(CP_ACP, 0, name.c_str(), -1, str, len);
set_thread_description(thread, str);
}
}
}
if (!IsDebuggerPresent()) { if (!IsDebuggerPresent()) {
return; return;
} }
THREADNAME_INFO info; THREADNAME_INFO info;
info.dwType = 0x1000; info.dwType = 0x1000;
info.szName = name.c_str(); info.szName = name.c_str();
@ -72,7 +57,21 @@ void set_name(HANDLE thread, const std::string& name) {
} }
} }
void set_name(const std::string& name) { set_name(GetCurrentThread(), name); } void set_name(HANDLE thread, const std::string_view name) {
auto kernel = GetModuleHandleW(L"kernel32.dll");
if (kernel) {
auto func =
(SetThreadDescriptionFn)GetProcAddress(kernel, "SetThreadDescription");
if (func) {
func(thread, reinterpret_cast<PCWSTR>(xe::to_utf16(name).c_str()));
}
}
raise_thread_name_exception(thread, std::string(name));
}
void set_name(const std::string_view name) {
set_name(GetCurrentThread(), name);
}
void MaybeYield() { void MaybeYield() {
SwitchToThread(); SwitchToThread();