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!
This commit is contained in:
parent
1cc0e4b4d8
commit
d37f0b29e2
|
@ -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
|
||||||
|
|
|
@ -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";
|
||||||
}
|
}
|
||||||
|
|
Reference in New Issue