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