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}
This commit is contained in:
@ -154,6 +154,7 @@ rtc_library("platform_thread_types") {
|
|||||||
"platform_thread_types.cc",
|
"platform_thread_types.cc",
|
||||||
"platform_thread_types.h",
|
"platform_thread_types.h",
|
||||||
]
|
]
|
||||||
|
deps = [ ":macromagic" ]
|
||||||
}
|
}
|
||||||
|
|
||||||
rtc_source_set("refcount") {
|
rtc_source_set("refcount") {
|
||||||
|
@ -15,6 +15,10 @@
|
|||||||
#include <sys/syscall.h>
|
#include <sys/syscall.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(WEBRTC_WIN)
|
||||||
|
#include "rtc_base/arraysize.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace rtc {
|
namespace rtc {
|
||||||
|
|
||||||
PlatformThreadId CurrentThreadId() {
|
PlatformThreadId CurrentThreadId() {
|
||||||
@ -58,6 +62,24 @@ bool IsThreadRefEqual(const PlatformThreadRef& a, const PlatformThreadRef& b) {
|
|||||||
|
|
||||||
void SetCurrentThreadName(const char* name) {
|
void SetCurrentThreadName(const char* name) {
|
||||||
#if defined(WEBRTC_WIN)
|
#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:
|
// For details see:
|
||||||
// https://docs.microsoft.com/en-us/visualstudio/debugger/how-to-set-a-thread-name-in-native-code
|
// https://docs.microsoft.com/en-us/visualstudio/debugger/how-to-set-a-thread-name-in-native-code
|
||||||
#pragma pack(push, 8)
|
#pragma pack(push, 8)
|
||||||
|
Reference in New Issue
Block a user