Use Windows 10 thread naming API
While profiling video chat in Chrome I noticed that some of the webrtc
threads were not named. This change adds conditional use of the thread
naming APIs. These thread names work even if you attach a debugger after
the thread is named, and they show up in ETW traces, for easier
profiling.
The sctp_create_thread_adapter threads are still not named but since
those are in C files they would require a C++-with-extern-C interface
to fix, so I'm leaving them for now.
Bug: webrtc:10745
Change-Id: I68f6aa780e2417ce706764d69e5b64cc48aba333
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/175280
Commit-Queue: Tommi <tommi@webrtc.org>
Reviewed-by: Tommi <tommi@webrtc.org>
Reviewed-by: Karl Wiberg <kwiberg@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#31285}
diff --git a/rtc_base/BUILD.gn b/rtc_base/BUILD.gn
index a61ede4..2d90898 100644
--- a/rtc_base/BUILD.gn
+++ b/rtc_base/BUILD.gn
@@ -154,6 +154,7 @@
"platform_thread_types.cc",
"platform_thread_types.h",
]
+ deps = [ ":macromagic" ]
}
rtc_source_set("refcount") {
diff --git a/rtc_base/platform_thread_types.cc b/rtc_base/platform_thread_types.cc
index ed4a228..a2f8d35 100644
--- a/rtc_base/platform_thread_types.cc
+++ b/rtc_base/platform_thread_types.cc
@@ -15,6 +15,10 @@
#include <sys/syscall.h>
#endif
+#if defined(WEBRTC_WIN)
+#include "rtc_base/arraysize.h"
+#endif
+
namespace rtc {
PlatformThreadId CurrentThreadId() {
@@ -58,6 +62,24 @@
void SetCurrentThreadName(const char* name) {
#if defined(WEBRTC_WIN)
+ // The SetThreadDescription API works even if no debugger is attached.
+ // The names set with this API also show up in ETW traces. Very handy.
+ static auto set_thread_description_func =
+ reinterpret_cast<decltype(&::SetThreadDescription)>(::GetProcAddress(
+ ::GetModuleHandleA("Kernel32.dll"), "SetThreadDescription"));
+ if (set_thread_description_func) {
+ // Convert from ASCII to UTF-16.
+ wchar_t wide_thread_name[64];
+ for (size_t i = 0; i < arraysize(wide_thread_name) - 1; ++i) {
+ wide_thread_name[i] = name[i];
+ if (wide_thread_name[i] == L'\0')
+ break;
+ }
+ // Guarantee null-termination.
+ wide_thread_name[arraysize(wide_thread_name) - 1] = L'\0';
+ set_thread_description_func(::GetCurrentThread(), wide_thread_name);
+ }
+
// For details see:
// https://docs.microsoft.com/en-us/visualstudio/debugger/how-to-set-a-thread-name-in-native-code
#pragma pack(push, 8)