diff options
| -rw-r--r-- | lldb/source/Target/Process.cpp | 6 | ||||
| -rw-r--r-- | llvm/include/llvm/Support/Threading.h | 4 | ||||
| -rw-r--r-- | llvm/lib/Support/Unix/Threading.inc | 30 | ||||
| -rw-r--r-- | llvm/lib/Support/Windows/Threading.inc | 2 |
4 files changed, 37 insertions, 5 deletions
diff --git a/lldb/source/Target/Process.cpp b/lldb/source/Target/Process.cpp index 2f0bb94ed3b..d0651e6bda7 100644 --- a/lldb/source/Target/Process.cpp +++ b/lldb/source/Target/Process.cpp @@ -14,6 +14,8 @@ // Other libraries and framework includes #include "llvm/Support/ScopedPrinter.h" +#include "llvm/Support/Threading.h" + // Project includes #include "Plugins/Process/Utility/InferiorCallPOSIX.h" #include "lldb/Breakpoint/BreakpointLocation.h" @@ -3733,8 +3735,8 @@ bool Process::StartPrivateStateThread(bool is_secondary_thread) { // Create a thread that watches our internal state and controls which // events make it to clients (into the DCProcess event queue). char thread_name[1024]; - - if (HostInfo::GetMaxThreadNameLength() <= 30) { + uint32_t max_len = llvm::get_max_thread_name_length(); + if (max_len > 0 && max_len <= 30) { // On platforms with abbreviated thread name lengths, choose thread names // that fit within the limit. if (already_running) diff --git a/llvm/include/llvm/Support/Threading.h b/llvm/include/llvm/Support/Threading.h index 3b7869b9253..9b6a3b4efdf 100644 --- a/llvm/include/llvm/Support/Threading.h +++ b/llvm/include/llvm/Support/Threading.h @@ -137,6 +137,10 @@ void llvm_execute_on_thread(void (*UserFn)(void *), void *UserData, /// this. uint64_t get_threadid(); + /// \brief Get the maximum length of a thread name on this platform. + /// A value of 0 means there is no limit. + constexpr uint32_t get_max_thread_name_length(); + /// \brief Set the name of the current thread. Setting a thread's name can /// be helpful for enabling useful diagnostics under a debugger or when /// logging. The level of support for setting a thread's name varies diff --git a/llvm/lib/Support/Unix/Threading.inc b/llvm/lib/Support/Unix/Threading.inc index b031ff4c034..833b6bed4e7 100644 --- a/llvm/lib/Support/Unix/Threading.inc +++ b/llvm/lib/Support/Unix/Threading.inc @@ -109,10 +109,35 @@ uint64_t llvm::get_threadid() { } +constexpr uint32_t llvm::get_max_thread_name_length() { +#if defined(__NetBSD__) + return PTHREAD_MAX_NAMELEN_NP; +#elif defined(__APPLE__) + return 64; +#elif defined(__linux__) +#if HAVE_PTHREAD_SETNAME_NP + return 16; +#else + return 0; +#endif +#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) + return 16; +#else + return 0; +#endif +} + void llvm::set_thread_name(const Twine &Name) { // Make sure the input is null terminated. SmallString<64> Storage; StringRef NameStr = Name.toNullTerminatedStringRef(Storage); + + // Truncate from the beginning, not the end, if the specified name is too + // long. For one, this ensures that the resulting string is still null + // terminated, but additionally the end of a long thread name will usually + // be more unique than the beginning, since a common pattern is for similar + // threads to share a common prefix. + NameStr = NameStr.take_back(get_max_thread_name_length()); (void)NameStr; #if defined(__linux__) #if (defined(__GLIBC__) && defined(_GNU_SOURCE)) || defined(__ANDROID__) @@ -170,15 +195,14 @@ void llvm::get_thread_name(SmallVectorImpl<char> &Name) { free(kp); return; #elif defined(__NetBSD__) - char buf[PTHREAD_MAX_NAMELEN_NP]; + char buf[get_max_thread_name_length()]; ::pthread_getname_np(::pthread_self(), buf, PTHREAD_MAX_NAMELEN_NP); Name.append(buf, buf + strlen(buf)); #elif defined(__linux__) #if (defined(__GLIBC__) && defined(_GNU_SOURCE)) || defined(__ANDROID__) #if HAVE_PTHREAD_GETNAME_NP - constexpr int MAXNAMELEN = 16; - char Buffer[MAXNAMELEN]; + char Buffer[get_max_thread_name_length()]; if (0 == ::pthread_getname_np(::pthread_self(), Buffer, MAXNAMELEN)) Name.append(Buffer, Buffer + strlen(Buffer)); #endif diff --git a/llvm/lib/Support/Windows/Threading.inc b/llvm/lib/Support/Windows/Threading.inc index 30086544ab2..8f36f79ca43 100644 --- a/llvm/lib/Support/Windows/Threading.inc +++ b/llvm/lib/Support/Windows/Threading.inc @@ -59,6 +59,8 @@ uint64_t llvm::get_threadid() { return uint64_t(::GetCurrentThreadId()); } +constexpr uint32_t llvm::get_max_thread_name_length() { return 0; } + void llvm::set_thread_name(const Twine &Name) { #if defined(_MSC_VER) // Make sure the input is null terminated. |

