From: Krzysztof Parzyszek Date: Fri, 3 Mar 2017 21:53:12 +0000 (+0000) Subject: Detect the existence of pthread_{s,g}etname_np in libpthread on Linux X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2b465546ecc2d08600b0b8780d709dfe06ffa7a5;p=llvm Detect the existence of pthread_{s,g}etname_np in libpthread on Linux Older Linux distributions may not have those functions. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@296915 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/cmake/config-ix.cmake b/cmake/config-ix.cmake index 42af23d377f..34c81fa2973 100755 --- a/cmake/config-ix.cmake +++ b/cmake/config-ix.cmake @@ -246,6 +246,14 @@ check_symbol_exists(__GLIBC__ stdio.h LLVM_USING_GLIBC) if( LLVM_USING_GLIBC ) add_llvm_definitions( -D_GNU_SOURCE ) endif() +# This check requires _GNU_SOURCE +if(HAVE_LIBPTHREAD) + check_library_exists(pthread pthread_getname_np "" HAVE_PTHREAD_GETNAME_NP) + check_library_exists(pthread pthread_setname_np "" HAVE_PTHREAD_SETNAME_NP) +elseif(PTHREAD_IN_LIBC) + check_library_exists(c pthread_getname_np "" HAVE_PTHREAD_GETNAME_NP) + check_library_exists(c pthread_setname_np "" HAVE_PTHREAD_SETNAME_NP) +endif() set(headers "sys/types.h") diff --git a/lib/Support/Unix/Threading.inc b/lib/Support/Unix/Threading.inc index 2bcf8e5cd5f..6301a674df0 100644 --- a/lib/Support/Unix/Threading.inc +++ b/lib/Support/Unix/Threading.inc @@ -115,8 +115,10 @@ void llvm::set_thread_name(const Twine &Name) { StringRef NameStr = Name.toNullTerminatedStringRef(Storage); #if defined(__linux__) #if (defined(__GLIBC__) && defined(_GNU_SOURCE)) || defined(__ANDROID__) +#if HAVE_PTHREAD_SETNAME_NP ::pthread_setname_np(::pthread_self(), NameStr.data()); #endif +#endif #elif defined(__FreeBSD__) ::pthread_set_name_np(::pthread_self(), NameStr.data()); #elif defined(__NetBSD__) @@ -173,10 +175,12 @@ void llvm::get_thread_name(SmallVectorImpl &Name) { 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]; if (0 == ::pthread_getname_np(::pthread_self(), Buffer, MAXNAMELEN)) Name.append(Buffer, Buffer + strlen(Buffer)); #endif #endif +#endif }