Explorar el Código

Fix thread naming on Linux, which limits names to 15 bytes.

- In `SetCurrentThreadName`, when on Linux, truncate to 15 bytes, as (at
  least on glibc) `pthread_set_name_np` will otherwise return `ERANGE` and
  do nothing.
- Also, add logging in case `pthread_set_name_np` returns an error
  anyway.  This is Linux-specific, as the Apple and BSD versions of
  `pthread_set_name_np return `void`.
- Change the name for CPU threads in multi-core mode from
  "yuzu:CoreCPUThread_N" (19 bytes) to "yuzu:CPUCore_N" (14 bytes) so it
  fits into the Linux limit.  Some other thread names are also cut off,
  but I didn't bother addressing them as you can guess them from the
  truncated versions.  For a CPU thread, truncation means you can't see
  which core it is!
comex hace 6 años
padre
commit
d37f0b29e2
Se han modificado 2 ficheros con 13 adiciones y 1 borrados
  1. 12 0
      src/common/thread.cpp
  2. 1 1
      src/core/cpu_manager.cpp

+ 12 - 0
src/common/thread.cpp

@@ -2,6 +2,8 @@
 // Licensed under GPLv2 or any later version
 // Licensed under GPLv2 or any later version
 // Refer to the license.txt file included.
 // Refer to the license.txt file included.
 
 
+#include "common/common_funcs.h"
+#include "common/logging/log.h"
 #include "common/thread.h"
 #include "common/thread.h"
 #ifdef __APPLE__
 #ifdef __APPLE__
 #include <mach/mach.h>
 #include <mach/mach.h>
@@ -19,6 +21,8 @@
 #include <unistd.h>
 #include <unistd.h>
 #endif
 #endif
 
 
+#include <string>
+
 #ifdef __FreeBSD__
 #ifdef __FreeBSD__
 #define cpu_set_t cpuset_t
 #define cpu_set_t cpuset_t
 #endif
 #endif
@@ -110,6 +114,14 @@ void SetCurrentThreadName(const char* name) {
     pthread_set_name_np(pthread_self(), name);
     pthread_set_name_np(pthread_self(), name);
 #elif defined(__NetBSD__)
 #elif defined(__NetBSD__)
     pthread_setname_np(pthread_self(), "%s", (void*)name);
     pthread_setname_np(pthread_self(), "%s", (void*)name);
+#elif defined(__linux__)
+    // Linux limits thread names to 15 characters and will outright reject any
+    // attempt to set a longer name with ERANGE.
+    std::string truncated(name, std::min(strlen(name), static_cast<size_t>(15)));
+    if (int e = pthread_setname_np(pthread_self(), truncated.c_str())) {
+        errno = e;
+        LOG_ERROR(Common, "Failed to set thread name to '{}': {}", truncated, GetLastErrorMsg());
+    }
 #else
 #else
     pthread_setname_np(pthread_self(), name);
     pthread_setname_np(pthread_self(), name);
 #endif
 #endif

+ 1 - 1
src/core/cpu_manager.cpp

@@ -331,7 +331,7 @@ void CpuManager::RunThread(std::size_t core) {
     system.RegisterCoreThread(core);
     system.RegisterCoreThread(core);
     std::string name;
     std::string name;
     if (is_multicore) {
     if (is_multicore) {
-        name = "yuzu:CoreCPUThread_" + std::to_string(core);
+        name = "yuzu:CPUCore_" + std::to_string(core);
     } else {
     } else {
         name = "yuzu:CPUThread";
         name = "yuzu:CPUThread";
     }
     }