Index: base/threading/platform_thread_win.cc |
diff --git a/base/threading/platform_thread_win.cc b/base/threading/platform_thread_win.cc |
index 2644eee520b82c0520c760addc8e9fc3415aadf2..e271fe8225545e14db5738f9cb8a7f9c7dd1d7cf 100644 |
--- a/base/threading/platform_thread_win.cc |
+++ b/base/threading/platform_thread_win.cc |
@@ -10,6 +10,7 @@ |
#include "base/debug/alias.h" |
#include "base/debug/profiler.h" |
#include "base/logging.h" |
+#include "base/strings/utf_string_conversions.h" |
#include "base/threading/thread_id_name_manager.h" |
#include "base/threading/thread_restrictions.h" |
#include "base/tracked_objects.h" |
@@ -30,6 +31,10 @@ typedef struct tagTHREADNAME_INFO { |
DWORD dwFlags; // Reserved for future use, must be zero. |
} THREADNAME_INFO; |
+// The SetThreadDescription API was brought in version 1607 of Windows 10. |
+typedef HRESULT(WINAPI* SetThreadDescription)(HANDLE hThread, |
+ PCWSTR lpThreadDescription); |
+ |
// This function has try handling, so it is separated out of its caller. |
void SetNameInternal(PlatformThreadId thread_id, const char* name) { |
THREADNAME_INFO info; |
@@ -172,6 +177,15 @@ void PlatformThread::SetName(const std::string& name) { |
if (name != "BrokerEvent") |
tracked_objects::ThreadData::InitializeThreadContext(name); |
+ // The SetThreadDescription API works even if no debugger is attached. |
+ auto set_thread_description_func = |
+ reinterpret_cast<SetThreadDescription>(::GetProcAddress( |
+ ::GetModuleHandle(L"Kernel32.dll"), "SetThreadDescription")); |
+ if (set_thread_description_func) { |
+ set_thread_description_func(::GetCurrentThread(), |
+ base::UTF8ToWide(name).c_str()); |
+ } |
+ |
// The debugger needs to be around to catch the name in the exception. If |
// there isn't a debugger, we are just needlessly throwing an exception. |
// If this image file is instrumented, we raise the exception anyway |