diff --git a/fml/thread.cc b/fml/thread.cc index cff08b4f8f87e..8fc43592d06d3 100644 --- a/fml/thread.cc +++ b/fml/thread.cc @@ -108,7 +108,11 @@ void SetThreadName(const std::string& name) { #if defined(FML_OS_MACOSX) pthread_setname_np(name.c_str()); #elif defined(FML_OS_LINUX) || defined(FML_OS_ANDROID) - pthread_setname_np(pthread_self(), name.c_str()); + // Linux thread names are limited to 16 characters including the terminating + // null. + constexpr std::string::size_type kLinuxMaxThreadNameLen = 15; + pthread_setname_np(pthread_self(), + name.substr(0, kLinuxMaxThreadNameLen).c_str()); #elif defined(FML_OS_WIN) THREADNAME_INFO info; info.dwType = 0x1000; diff --git a/fml/thread_unittests.cc b/fml/thread_unittests.cc index 0f668aed3ed5d..8e596edee4618 100644 --- a/fml/thread_unittests.cc +++ b/fml/thread_unittests.cc @@ -149,4 +149,19 @@ TEST(Thread, ThreadPriorityCreatedWithConfig) { thread.Join(); ASSERT_TRUE(done); } -#endif +#endif // FLUTTER_PTHREAD_SUPPORTED + +#if defined(FML_OS_LINUX) +TEST(Thread, LinuxLongThreadNameTruncated) { + const std::string name = "VeryLongThreadNameTest"; + fml::Thread thread(name); + + thread.GetTaskRunner()->PostTask([&name]() { + constexpr size_t kThreadNameLen = 16; + char thread_name[kThreadNameLen]; + pthread_getname_np(pthread_self(), thread_name, kThreadNameLen); + ASSERT_EQ(thread_name, name.substr(0, kThreadNameLen - 1)); + }); + thread.Join(); +} +#endif // FML_OS_LINUX diff --git a/impeller/renderer/backend/vulkan/context_vk.cc b/impeller/renderer/backend/vulkan/context_vk.cc index 6c1804dd74022..df1dea8e795f0 100644 --- a/impeller/renderer/backend/vulkan/context_vk.cc +++ b/impeller/renderer/backend/vulkan/context_vk.cc @@ -130,7 +130,7 @@ void ContextVK::Setup(Settings settings) { return; } - queue_submit_thread_ = std::make_unique("QueueSubmitThread"); + queue_submit_thread_ = std::make_unique("IplrVkQueueSub"); queue_submit_thread_->GetTaskRunner()->PostTask([]() { // submitKHR is extremely cheap and mostly blocks on an internal fence. fml::RequestAffinity(fml::CpuAffinity::kEfficiency); diff --git a/impeller/renderer/backend/vulkan/fence_waiter_vk.cc b/impeller/renderer/backend/vulkan/fence_waiter_vk.cc index 11ee7f0b7db72..a43426f452fe6 100644 --- a/impeller/renderer/backend/vulkan/fence_waiter_vk.cc +++ b/impeller/renderer/backend/vulkan/fence_waiter_vk.cc @@ -91,7 +91,7 @@ static std::vector GetFencesForWaitSet(const WaitSet& set) { void FenceWaiterVK::Main() { fml::Thread::SetCurrentThreadName( - fml::Thread::ThreadConfig{"io.flutter.impeller.fence_waiter"}); + fml::Thread::ThreadConfig{"IplrVkFenceWait"}); // Since this thread mostly waits on fences, it doesn't need to be fast. fml::RequestAffinity(fml::CpuAffinity::kEfficiency); diff --git a/impeller/renderer/backend/vulkan/resource_manager_vk.cc b/impeller/renderer/backend/vulkan/resource_manager_vk.cc index b719737337f8e..8b55801047ec9 100644 --- a/impeller/renderer/backend/vulkan/resource_manager_vk.cc +++ b/impeller/renderer/backend/vulkan/resource_manager_vk.cc @@ -38,8 +38,7 @@ void ResourceManagerVK::Start() { // // ... so no FML_DCHECK here. - fml::Thread::SetCurrentThreadName( - fml::Thread::ThreadConfig{"io.flutter.impeller.resource_manager"}); + fml::Thread::SetCurrentThreadName(fml::Thread::ThreadConfig{"IplrVkResMgr"}); // While this code calls destructors it doesn't need to be particularly fast // with them, as long as it doesn't interrupt raster thread. fml::RequestAffinity(fml::CpuAffinity::kEfficiency);