<div dir="ltr">Which function does it not provide specifically? Can you link me to a failing buildbot?</div><br><div class="gmail_quote"><div dir="ltr">On Fri, Mar 3, 2017 at 11:01 AM Krzysztof Parzyszek via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">This thing fails to build on older Linuxes (e.g. SUSE).<br class="gmail_msg">
Glibc 2.11.3 does not provide this function.<br class="gmail_msg">
<br class="gmail_msg">
This breaks some of our builds.<br class="gmail_msg">
<br class="gmail_msg">
-Krzysztof<br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
On 3/3/2017 11:15 AM, Zachary Turner via llvm-commits wrote:<br class="gmail_msg">
> Author: zturner<br class="gmail_msg">
> Date: Fri Mar 3 11:15:17 2017<br class="gmail_msg">
> New Revision: 296887<br class="gmail_msg">
><br class="gmail_msg">
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=296887&view=rev" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project?rev=296887&view=rev</a><br class="gmail_msg">
> Log:<br class="gmail_msg">
> [Support] Provide access to current thread name/thread id.<br class="gmail_msg">
><br class="gmail_msg">
> Applications often need the current thread id when making<br class="gmail_msg">
> system calls, and some operating systems provide the notion<br class="gmail_msg">
> of a thread name, which can be useful in enabling better<br class="gmail_msg">
> diagnostics when debugging or logging.<br class="gmail_msg">
><br class="gmail_msg">
> This patch adds an accessor for the thread id, and "best effort"<br class="gmail_msg">
> getters and setters for the thread name. Since this is<br class="gmail_msg">
> non critical functionality, no error is returned to indicate<br class="gmail_msg">
> that a platform doesn't support thread names.<br class="gmail_msg">
><br class="gmail_msg">
> Differential Revision: <a href="https://reviews.llvm.org/D30526" rel="noreferrer" class="gmail_msg" target="_blank">https://reviews.llvm.org/D30526</a><br class="gmail_msg">
><br class="gmail_msg">
> Added:<br class="gmail_msg">
> llvm/trunk/lib/Support/Unix/Threading.inc<br class="gmail_msg">
> llvm/trunk/lib/Support/Windows/Threading.inc<br class="gmail_msg">
> Modified:<br class="gmail_msg">
> llvm/trunk/include/llvm/Support/Threading.h<br class="gmail_msg">
> llvm/trunk/lib/Support/Threading.cpp<br class="gmail_msg">
><br class="gmail_msg">
> Modified: llvm/trunk/include/llvm/Support/Threading.h<br class="gmail_msg">
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/Threading.h?rev=296887&r1=296886&r2=296887&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/Threading.h?rev=296887&r1=296886&r2=296887&view=diff</a><br class="gmail_msg">
> ==============================================================================<br class="gmail_msg">
> --- llvm/trunk/include/llvm/Support/Threading.h (original)<br class="gmail_msg">
> +++ llvm/trunk/include/llvm/Support/Threading.h Fri Mar 3 11:15:17 2017<br class="gmail_msg">
> @@ -15,6 +15,7 @@<br class="gmail_msg">
> #ifndef LLVM_SUPPORT_THREADING_H<br class="gmail_msg">
> #define LLVM_SUPPORT_THREADING_H<br class="gmail_msg">
><br class="gmail_msg">
> +#include "llvm/ADT/SmallVector.h"<br class="gmail_msg">
> #include "llvm/Config/llvm-config.h" // for LLVM_ON_UNIX<br class="gmail_msg">
> #include "llvm/Support/Compiler.h"<br class="gmail_msg">
> #include <ciso646> // So we can check the C++ standard lib macros.<br class="gmail_msg">
> @@ -42,24 +43,26 @@<br class="gmail_msg">
> #endif<br class="gmail_msg">
><br class="gmail_msg">
> namespace llvm {<br class="gmail_msg">
> - /// Returns true if LLVM is compiled with support for multi-threading, and<br class="gmail_msg">
> - /// false otherwise.<br class="gmail_msg">
> - bool llvm_is_multithreaded();<br class="gmail_msg">
> -<br class="gmail_msg">
> - /// llvm_execute_on_thread - Execute the given \p UserFn on a separate<br class="gmail_msg">
> - /// thread, passing it the provided \p UserData and waits for thread<br class="gmail_msg">
> - /// completion.<br class="gmail_msg">
> - ///<br class="gmail_msg">
> - /// This function does not guarantee that the code will actually be executed<br class="gmail_msg">
> - /// on a separate thread or honoring the requested stack size, but tries to do<br class="gmail_msg">
> - /// so where system support is available.<br class="gmail_msg">
> - ///<br class="gmail_msg">
> - /// \param UserFn - The callback to execute.<br class="gmail_msg">
> - /// \param UserData - An argument to pass to the callback function.<br class="gmail_msg">
> - /// \param RequestedStackSize - If non-zero, a requested size (in bytes) for<br class="gmail_msg">
> - /// the thread stack.<br class="gmail_msg">
> - void llvm_execute_on_thread(void (*UserFn)(void*), void *UserData,<br class="gmail_msg">
> - unsigned RequestedStackSize = 0);<br class="gmail_msg">
> +class Twine;<br class="gmail_msg">
> +<br class="gmail_msg">
> +/// Returns true if LLVM is compiled with support for multi-threading, and<br class="gmail_msg">
> +/// false otherwise.<br class="gmail_msg">
> +bool llvm_is_multithreaded();<br class="gmail_msg">
> +<br class="gmail_msg">
> +/// llvm_execute_on_thread - Execute the given \p UserFn on a separate<br class="gmail_msg">
> +/// thread, passing it the provided \p UserData and waits for thread<br class="gmail_msg">
> +/// completion.<br class="gmail_msg">
> +///<br class="gmail_msg">
> +/// This function does not guarantee that the code will actually be executed<br class="gmail_msg">
> +/// on a separate thread or honoring the requested stack size, but tries to do<br class="gmail_msg">
> +/// so where system support is available.<br class="gmail_msg">
> +///<br class="gmail_msg">
> +/// \param UserFn - The callback to execute.<br class="gmail_msg">
> +/// \param UserData - An argument to pass to the callback function.<br class="gmail_msg">
> +/// \param RequestedStackSize - If non-zero, a requested size (in bytes) for<br class="gmail_msg">
> +/// the thread stack.<br class="gmail_msg">
> +void llvm_execute_on_thread(void (*UserFn)(void *), void *UserData,<br class="gmail_msg">
> + unsigned RequestedStackSize = 0);<br class="gmail_msg">
><br class="gmail_msg">
> #if LLVM_THREADING_USE_STD_CALL_ONCE<br class="gmail_msg">
><br class="gmail_msg">
> @@ -127,6 +130,28 @@ namespace llvm {<br class="gmail_msg">
> /// thread::hardware_concurrency().<br class="gmail_msg">
> /// Returns 1 when LLVM is configured with LLVM_ENABLE_THREADS=OFF<br class="gmail_msg">
> unsigned heavyweight_hardware_concurrency();<br class="gmail_msg">
> +<br class="gmail_msg">
> + /// \brief Return the current thread id, as used in various OS system calls.<br class="gmail_msg">
> + /// Note that not all platforms guarantee that the value returned will be<br class="gmail_msg">
> + /// unique across the entire system, so portable code should not assume<br class="gmail_msg">
> + /// this.<br class="gmail_msg">
> + uint64_t get_threadid();<br class="gmail_msg">
> +<br class="gmail_msg">
> + /// \brief Set the name of the current thread. Setting a thread's name can<br class="gmail_msg">
> + /// be helpful for enabling useful diagnostics under a debugger or when<br class="gmail_msg">
> + /// logging. The level of support for setting a thread's name varies<br class="gmail_msg">
> + /// wildly across operating systems, and we only make a best effort to<br class="gmail_msg">
> + /// perform the operation on supported platforms. No indication of success<br class="gmail_msg">
> + /// or failure is returned.<br class="gmail_msg">
> + void set_thread_name(const Twine &Name);<br class="gmail_msg">
> +<br class="gmail_msg">
> + /// \brief Get the name of the current thread. The level of support for<br class="gmail_msg">
> + /// getting a thread's name varies wildly across operating systems, and it<br class="gmail_msg">
> + /// is not even guaranteed that if you can successfully set a thread's name<br class="gmail_msg">
> + /// that you can later get it back. This function is intended for diagnostic<br class="gmail_msg">
> + /// purposes, and as with setting a thread's name no indication of whether<br class="gmail_msg">
> + /// the operation succeeded or failed is returned.<br class="gmail_msg">
> + void get_thread_name(SmallVectorImpl<char> &Name);<br class="gmail_msg">
> }<br class="gmail_msg">
><br class="gmail_msg">
> #endif<br class="gmail_msg">
><br class="gmail_msg">
> Modified: llvm/trunk/lib/Support/Threading.cpp<br class="gmail_msg">
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Threading.cpp?rev=296887&r1=296886&r2=296887&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Threading.cpp?rev=296887&r1=296886&r2=296887&view=diff</a><br class="gmail_msg">
> ==============================================================================<br class="gmail_msg">
> --- llvm/trunk/lib/Support/Threading.cpp (original)<br class="gmail_msg">
> +++ llvm/trunk/lib/Support/Threading.cpp Fri Mar 3 11:15:17 2017<br class="gmail_msg">
> @@ -14,14 +14,21 @@<br class="gmail_msg">
><br class="gmail_msg">
> #include "llvm/Support/Threading.h"<br class="gmail_msg">
> #include "llvm/Config/config.h"<br class="gmail_msg">
> -#include "llvm/Support/Atomic.h"<br class="gmail_msg">
> #include "llvm/Support/Host.h"<br class="gmail_msg">
> -#include "llvm/Support/Mutex.h"<br class="gmail_msg">
> #include "llvm/Support/thread.h"<br class="gmail_msg">
> +<br class="gmail_msg">
> #include <cassert><br class="gmail_msg">
> +#include <errno.h><br class="gmail_msg">
> +#include <stdlib.h><br class="gmail_msg">
> +#include <string.h><br class="gmail_msg">
><br class="gmail_msg">
> using namespace llvm;<br class="gmail_msg">
><br class="gmail_msg">
> +//===----------------------------------------------------------------------===//<br class="gmail_msg">
> +//=== WARNING: Implementation here must contain only TRULY operating system<br class="gmail_msg">
> +//=== independent code.<br class="gmail_msg">
> +//===----------------------------------------------------------------------===//<br class="gmail_msg">
> +<br class="gmail_msg">
> bool llvm::llvm_is_multithreaded() {<br class="gmail_msg">
> #if LLVM_ENABLE_THREADS != 0<br class="gmail_msg">
> return true;<br class="gmail_msg">
> @@ -30,100 +37,38 @@ bool llvm::llvm_is_multithreaded() {<br class="gmail_msg">
> #endif<br class="gmail_msg">
> }<br class="gmail_msg">
><br class="gmail_msg">
> -#if LLVM_ENABLE_THREADS != 0 && defined(HAVE_PTHREAD_H)<br class="gmail_msg">
> -#include <pthread.h><br class="gmail_msg">
> -<br class="gmail_msg">
> -struct ThreadInfo {<br class="gmail_msg">
> - void (*UserFn)(void *);<br class="gmail_msg">
> - void *UserData;<br class="gmail_msg">
> -};<br class="gmail_msg">
> -static void *ExecuteOnThread_Dispatch(void *Arg) {<br class="gmail_msg">
> - ThreadInfo *TI = reinterpret_cast<ThreadInfo*>(Arg);<br class="gmail_msg">
> - TI->UserFn(TI->UserData);<br class="gmail_msg">
> - return nullptr;<br class="gmail_msg">
> -}<br class="gmail_msg">
> -<br class="gmail_msg">
> -void llvm::llvm_execute_on_thread(void (*Fn)(void*), void *UserData,<br class="gmail_msg">
> +#if LLVM_ENABLE_THREADS == 0 || \<br class="gmail_msg">
> + (!defined(LLVM_ON_WIN32) && !defined(HAVE_PTHREAD_H))<br class="gmail_msg">
> +// Support for non-Win32, non-pthread implementation.<br class="gmail_msg">
> +void llvm::llvm_execute_on_thread(void (*Fn)(void *), void *UserData,<br class="gmail_msg">
> unsigned RequestedStackSize) {<br class="gmail_msg">
> - ThreadInfo Info = { Fn, UserData };<br class="gmail_msg">
> - pthread_attr_t Attr;<br class="gmail_msg">
> - pthread_t Thread;<br class="gmail_msg">
> -<br class="gmail_msg">
> - // Construct the attributes object.<br class="gmail_msg">
> - if (::pthread_attr_init(&Attr) != 0)<br class="gmail_msg">
> - return;<br class="gmail_msg">
> -<br class="gmail_msg">
> - // Set the requested stack size, if given.<br class="gmail_msg">
> - if (RequestedStackSize != 0) {<br class="gmail_msg">
> - if (::pthread_attr_setstacksize(&Attr, RequestedStackSize) != 0)<br class="gmail_msg">
> - goto error;<br class="gmail_msg">
> - }<br class="gmail_msg">
> -<br class="gmail_msg">
> - // Construct and execute the thread.<br class="gmail_msg">
> - if (::pthread_create(&Thread, &Attr, ExecuteOnThread_Dispatch, &Info) != 0)<br class="gmail_msg">
> - goto error;<br class="gmail_msg">
> -<br class="gmail_msg">
> - // Wait for the thread and clean up.<br class="gmail_msg">
> - ::pthread_join(Thread, nullptr);<br class="gmail_msg">
> -<br class="gmail_msg">
> - error:<br class="gmail_msg">
> - ::pthread_attr_destroy(&Attr);<br class="gmail_msg">
> + (void)RequestedStackSize;<br class="gmail_msg">
> + Fn(UserData);<br class="gmail_msg">
> }<br class="gmail_msg">
> -#elif LLVM_ENABLE_THREADS!=0 && defined(LLVM_ON_WIN32)<br class="gmail_msg">
> -#include "Windows/WindowsSupport.h"<br class="gmail_msg">
> -#include <process.h><br class="gmail_msg">
> -<br class="gmail_msg">
> -// Windows will at times define MemoryFence.<br class="gmail_msg">
> -#ifdef MemoryFence<br class="gmail_msg">
> -#undef MemoryFence<br class="gmail_msg">
> -#endif<br class="gmail_msg">
><br class="gmail_msg">
> -struct ThreadInfo {<br class="gmail_msg">
> - void (*func)(void*);<br class="gmail_msg">
> - void *param;<br class="gmail_msg">
> -};<br class="gmail_msg">
> -<br class="gmail_msg">
> -static unsigned __stdcall ThreadCallback(void *param) {<br class="gmail_msg">
> - struct ThreadInfo *info = reinterpret_cast<struct ThreadInfo *>(param);<br class="gmail_msg">
> - info->func(info->param);<br class="gmail_msg">
> +unsigned llvm::heavyweight_hardware_concurrency() { return 1; }<br class="gmail_msg">
><br class="gmail_msg">
> - return 0;<br class="gmail_msg">
> -}<br class="gmail_msg">
> +uint64_t llvm::get_threadid_np() { return 0; }<br class="gmail_msg">
><br class="gmail_msg">
> -void llvm::llvm_execute_on_thread(void (*Fn)(void*), void *UserData,<br class="gmail_msg">
> - unsigned RequestedStackSize) {<br class="gmail_msg">
> - struct ThreadInfo param = { Fn, UserData };<br class="gmail_msg">
> +void llvm::set_thread_name(const Twine &Name) {}<br class="gmail_msg">
><br class="gmail_msg">
> - HANDLE hThread = (HANDLE)::_beginthreadex(NULL,<br class="gmail_msg">
> - RequestedStackSize, ThreadCallback,<br class="gmail_msg">
> - ¶m, 0, NULL);<br class="gmail_msg">
> -<br class="gmail_msg">
> - if (hThread) {<br class="gmail_msg">
> - // We actually don't care whether the wait succeeds or fails, in<br class="gmail_msg">
> - // the same way we don't care whether the pthread_join call succeeds<br class="gmail_msg">
> - // or fails. There's not much we could do if this were to fail. But<br class="gmail_msg">
> - // on success, this call will wait until the thread finishes executing<br class="gmail_msg">
> - // before returning.<br class="gmail_msg">
> - (void)::WaitForSingleObject(hThread, INFINITE);<br class="gmail_msg">
> - ::CloseHandle(hThread);<br class="gmail_msg">
> - }<br class="gmail_msg">
> -}<br class="gmail_msg">
> -#else<br class="gmail_msg">
> -// Support for non-Win32, non-pthread implementation.<br class="gmail_msg">
> -void llvm::llvm_execute_on_thread(void (*Fn)(void*), void *UserData,<br class="gmail_msg">
> - unsigned RequestedStackSize) {<br class="gmail_msg">
> - (void) RequestedStackSize;<br class="gmail_msg">
> - Fn(UserData);<br class="gmail_msg">
> -}<br class="gmail_msg">
> +void llvm::get_thread_name(SmallVectorImpl<char> &Name) { Name.clear(); }<br class="gmail_msg">
><br class="gmail_msg">
> -#endif<br class="gmail_msg">
> +#else<br class="gmail_msg">
><br class="gmail_msg">
> unsigned llvm::heavyweight_hardware_concurrency() {<br class="gmail_msg">
> -#if !LLVM_ENABLE_THREADS<br class="gmail_msg">
> - return 1;<br class="gmail_msg">
> -#endif<br class="gmail_msg">
> int NumPhysical = sys::getHostNumPhysicalCores();<br class="gmail_msg">
> if (NumPhysical == -1)<br class="gmail_msg">
> return thread::hardware_concurrency();<br class="gmail_msg">
> return NumPhysical;<br class="gmail_msg">
> }<br class="gmail_msg">
> +<br class="gmail_msg">
> +// Include the platform-specific parts of this class.<br class="gmail_msg">
> +#ifdef LLVM_ON_UNIX<br class="gmail_msg">
> +#include "Unix/Threading.inc"<br class="gmail_msg">
> +#endif<br class="gmail_msg">
> +#ifdef LLVM_ON_WIN32<br class="gmail_msg">
> +#include "Windows/Threading.inc"<br class="gmail_msg">
> +#endif<br class="gmail_msg">
> +<br class="gmail_msg">
> +#endif<br class="gmail_msg">
><br class="gmail_msg">
> Added: llvm/trunk/lib/Support/Unix/Threading.inc<br class="gmail_msg">
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Unix/Threading.inc?rev=296887&view=auto" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Unix/Threading.inc?rev=296887&view=auto</a><br class="gmail_msg">
> ==============================================================================<br class="gmail_msg">
> --- llvm/trunk/lib/Support/Unix/Threading.inc (added)<br class="gmail_msg">
> +++ llvm/trunk/lib/Support/Unix/Threading.inc Fri Mar 3 11:15:17 2017<br class="gmail_msg">
> @@ -0,0 +1,181 @@<br class="gmail_msg">
> +//===- Unix/Threading.inc - Unix Threading Implementation ----- -*- C++ -*-===//<br class="gmail_msg">
> +//<br class="gmail_msg">
> +// The LLVM Compiler Infrastructure<br class="gmail_msg">
> +//<br class="gmail_msg">
> +// This file is distributed under the University of Illinois Open Source<br class="gmail_msg">
> +// License. See LICENSE.TXT for details.<br class="gmail_msg">
> +//<br class="gmail_msg">
> +//===----------------------------------------------------------------------===//<br class="gmail_msg">
> +//<br class="gmail_msg">
> +// This file provides the Unix specific implementation of Threading functions.<br class="gmail_msg">
> +//<br class="gmail_msg">
> +//===----------------------------------------------------------------------===//<br class="gmail_msg">
> +<br class="gmail_msg">
> +#include "llvm/ADT/SmallString.h"<br class="gmail_msg">
> +#include "llvm/ADT/Twine.h"<br class="gmail_msg">
> +<br class="gmail_msg">
> +#if defined(__APPLE__)<br class="gmail_msg">
> +#include <mach/mach_init.h><br class="gmail_msg">
> +#include <mach/mach_port.h><br class="gmail_msg">
> +#endif<br class="gmail_msg">
> +<br class="gmail_msg">
> +#include <pthread.h><br class="gmail_msg">
> +<br class="gmail_msg">
> +#if defined(__FreeBSD__)<br class="gmail_msg">
> +#include <pthread_np.h><br class="gmail_msg">
> +#endif<br class="gmail_msg">
> +<br class="gmail_msg">
> +#if defined(__NetBSD__)<br class="gmail_msg">
> +#include <lwp.h><br class="gmail_msg">
> +#endif<br class="gmail_msg">
> +<br class="gmail_msg">
> +#if defined(__linux__)<br class="gmail_msg">
> +#include <sys/syscall.h><br class="gmail_msg">
> +#endif<br class="gmail_msg">
> +<br class="gmail_msg">
> +#if defined(__NetBSD__) || defined(__FreeBSD__) || defined(__FreeBSD_kernel__)<br class="gmail_msg">
> +#include <sys/sysctl.h><br class="gmail_msg">
> +#include <sys/user.h><br class="gmail_msg">
> +#endif<br class="gmail_msg">
> +<br class="gmail_msg">
> +namespace {<br class="gmail_msg">
> + struct ThreadInfo {<br class="gmail_msg">
> + void(*UserFn)(void *);<br class="gmail_msg">
> + void *UserData;<br class="gmail_msg">
> + };<br class="gmail_msg">
> +}<br class="gmail_msg">
> +<br class="gmail_msg">
> +static void *ExecuteOnThread_Dispatch(void *Arg) {<br class="gmail_msg">
> + ThreadInfo *TI = reinterpret_cast<ThreadInfo*>(Arg);<br class="gmail_msg">
> + TI->UserFn(TI->UserData);<br class="gmail_msg">
> + return nullptr;<br class="gmail_msg">
> +}<br class="gmail_msg">
> +<br class="gmail_msg">
> +void llvm::llvm_execute_on_thread(void(*Fn)(void*), void *UserData,<br class="gmail_msg">
> + unsigned RequestedStackSize) {<br class="gmail_msg">
> + ThreadInfo Info = { Fn, UserData };<br class="gmail_msg">
> + pthread_attr_t Attr;<br class="gmail_msg">
> + pthread_t Thread;<br class="gmail_msg">
> +<br class="gmail_msg">
> + // Construct the attributes object.<br class="gmail_msg">
> + if (::pthread_attr_init(&Attr) != 0)<br class="gmail_msg">
> + return;<br class="gmail_msg">
> +<br class="gmail_msg">
> + // Set the requested stack size, if given.<br class="gmail_msg">
> + if (RequestedStackSize != 0) {<br class="gmail_msg">
> + if (::pthread_attr_setstacksize(&Attr, RequestedStackSize) != 0)<br class="gmail_msg">
> + goto error;<br class="gmail_msg">
> + }<br class="gmail_msg">
> +<br class="gmail_msg">
> + // Construct and execute the thread.<br class="gmail_msg">
> + if (::pthread_create(&Thread, &Attr, ExecuteOnThread_Dispatch, &Info) != 0)<br class="gmail_msg">
> + goto error;<br class="gmail_msg">
> +<br class="gmail_msg">
> + // Wait for the thread and clean up.<br class="gmail_msg">
> + ::pthread_join(Thread, nullptr);<br class="gmail_msg">
> +<br class="gmail_msg">
> +error:<br class="gmail_msg">
> + ::pthread_attr_destroy(&Attr);<br class="gmail_msg">
> +}<br class="gmail_msg">
> +<br class="gmail_msg">
> +<br class="gmail_msg">
> +uint64_t llvm::get_threadid() {<br class="gmail_msg">
> +#if defined(__APPLE__)<br class="gmail_msg">
> + // Calling "mach_thread_self()" bumps the reference count on the thread<br class="gmail_msg">
> + // port, so we need to deallocate it. mach_task_self() doesn't bump the ref<br class="gmail_msg">
> + // count.<br class="gmail_msg">
> + thread_port_t Self = mach_thread_self();<br class="gmail_msg">
> + mach_port_deallocate(mach_task_self(), Self);<br class="gmail_msg">
> + return Self;<br class="gmail_msg">
> +#elif defined(__FreeBSD__)<br class="gmail_msg">
> + return uint64_t(pthread_getthreadid_np());<br class="gmail_msg">
> +#elif defined(__NetBSD__)<br class="gmail_msg">
> + return uint64_t(_lwp_self());<br class="gmail_msg">
> +#elif defined(__ANDROID__)<br class="gmail_msg">
> + return uint64_t(gettid());<br class="gmail_msg">
> +#elif defined(__linux__)<br class="gmail_msg">
> + return uint64_t(syscall(SYS_gettid));<br class="gmail_msg">
> +#elif defined(LLVM_ON_WIN32)<br class="gmail_msg">
> + return uint64_t(::GetCurrentThreadId());<br class="gmail_msg">
> +#else<br class="gmail_msg">
> + return uint64_t(pthread_self());<br class="gmail_msg">
> +#endif<br class="gmail_msg">
> +}<br class="gmail_msg">
> +<br class="gmail_msg">
> +<br class="gmail_msg">
> +void llvm::set_thread_name(const Twine &Name) {<br class="gmail_msg">
> + // Make sure the input is null terminated.<br class="gmail_msg">
> + SmallString<64> Storage;<br class="gmail_msg">
> + StringRef NameStr = Name.toNullTerminatedStringRef(Storage);<br class="gmail_msg">
> +#if defined(__linux__)<br class="gmail_msg">
> +#if (defined(__GLIBC__) && defined(_GNU_SOURCE)) || defined(__ANDROID__)<br class="gmail_msg">
> + ::pthread_setname_np(::pthread_self(), NameStr.data());<br class="gmail_msg">
> +#endif<br class="gmail_msg">
> +#elif defined(__FreeBSD__)<br class="gmail_msg">
> + ::pthread_set_name_np(::pthread_self(), NameStr.data());<br class="gmail_msg">
> +#elif defined(__NetBSD__)<br class="gmail_msg">
> + ::pthread_setname_np(::pthread_self(), "%s",<br class="gmail_msg">
> + const_cast<char *>(NameStr.data()));<br class="gmail_msg">
> +#elif defined(__APPLE__)<br class="gmail_msg">
> + ::pthread_setname_np(NameStr.data());<br class="gmail_msg">
> +#endif<br class="gmail_msg">
> +}<br class="gmail_msg">
> +<br class="gmail_msg">
> +void llvm::get_thread_name(SmallVectorImpl<char> &Name) {<br class="gmail_msg">
> + Name.clear();<br class="gmail_msg">
> +<br class="gmail_msg">
> +#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)<br class="gmail_msg">
> +#if defined(__FreeBSD_kernel__)<br class="gmail_msg">
> + int pid = ::pthread_self();<br class="gmail_msg">
> +#else<br class="gmail_msg">
> + int pid = ::getpid();<br class="gmail_msg">
> +#endif<br class="gmail_msg">
> +<br class="gmail_msg">
> + int tid = ::pthread_getthreadid_np();<br class="gmail_msg">
> +<br class="gmail_msg">
> + struct kinfo_proc *kp = nullptr, *nkp;<br class="gmail_msg">
> + size_t len = 0;<br class="gmail_msg">
> + int error;<br class="gmail_msg">
> + int ctl[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PID | KERN_PROC_INC_THREAD,<br class="gmail_msg">
> + (int)pid };<br class="gmail_msg">
> +<br class="gmail_msg">
> + while (1) {<br class="gmail_msg">
> + error = sysctl(ctl, 4, kp, &len, nullptr, 0);<br class="gmail_msg">
> + if (kp == nullptr || (error != 0 && errno == ENOMEM)) {<br class="gmail_msg">
> + // Add extra space in case threads are added before next call.<br class="gmail_msg">
> + len += sizeof(*kp) + len / 10;<br class="gmail_msg">
> + nkp = (struct kinfo_proc *)realloc(kp, len);<br class="gmail_msg">
> + if (nkp == nullptr) {<br class="gmail_msg">
> + free(kp);<br class="gmail_msg">
> + return;<br class="gmail_msg">
> + }<br class="gmail_msg">
> + kp = nkp;<br class="gmail_msg">
> + continue;<br class="gmail_msg">
> + }<br class="gmail_msg">
> + if (error != 0)<br class="gmail_msg">
> + len = 0;<br class="gmail_msg">
> + break;<br class="gmail_msg">
> + }<br class="gmail_msg">
> +<br class="gmail_msg">
> + for (size_t i = 0; i < len / sizeof(*kp); i++) {<br class="gmail_msg">
> + if (kp[i].ki_tid == (lwpid_t)tid) {<br class="gmail_msg">
> + Name.append(kp[i].ki_tdname, kp[i].ki_tdname + strlen(kp[i].ki_tdname));<br class="gmail_msg">
> + break;<br class="gmail_msg">
> + }<br class="gmail_msg">
> + }<br class="gmail_msg">
> + free(kp);<br class="gmail_msg">
> + return;<br class="gmail_msg">
> +#elif defined(__NetBSD__)<br class="gmail_msg">
> + char buf[PTHREAD_MAX_NAMELEN_NP];<br class="gmail_msg">
> + ::pthread_getname_np(::pthread_self(), buf, PTHREAD_MAX_NAMELEN_NP);<br class="gmail_msg">
> +<br class="gmail_msg">
> + Name.append(buf, buf + strlen(buf));<br class="gmail_msg">
> +#elif defined(__linux__)<br class="gmail_msg">
> +#if (defined(__GLIBC__) && defined(_GNU_SOURCE)) || defined(__ANDROID__)<br class="gmail_msg">
> + constexpr int MAXNAMELEN = 16;<br class="gmail_msg">
> + char Buffer[MAXNAMELEN];<br class="gmail_msg">
> + if (0 == ::pthread_getname_np(::pthread_self(), Buffer, MAXNAMELEN))<br class="gmail_msg">
> + Name.append(Buffer, Buffer + strlen(Buffer));<br class="gmail_msg">
> +#endif<br class="gmail_msg">
> +#endif<br class="gmail_msg">
> +}<br class="gmail_msg">
><br class="gmail_msg">
> Added: llvm/trunk/lib/Support/Windows/Threading.inc<br class="gmail_msg">
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Windows/Threading.inc?rev=296887&view=auto" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Windows/Threading.inc?rev=296887&view=auto</a><br class="gmail_msg">
> ==============================================================================<br class="gmail_msg">
> --- llvm/trunk/lib/Support/Windows/Threading.inc (added)<br class="gmail_msg">
> +++ llvm/trunk/lib/Support/Windows/Threading.inc Fri Mar 3 11:15:17 2017<br class="gmail_msg">
> @@ -0,0 +1,101 @@<br class="gmail_msg">
> +//===- Windows/Threading.inc - Win32 Threading Implementation - -*- C++ -*-===//<br class="gmail_msg">
> +//<br class="gmail_msg">
> +// The LLVM Compiler Infrastructure<br class="gmail_msg">
> +//<br class="gmail_msg">
> +// This file is distributed under the University of Illinois Open Source<br class="gmail_msg">
> +// License. See LICENSE.TXT for details.<br class="gmail_msg">
> +//<br class="gmail_msg">
> +//===----------------------------------------------------------------------===//<br class="gmail_msg">
> +//<br class="gmail_msg">
> +// This file provides the Win32 specific implementation of Threading functions.<br class="gmail_msg">
> +//<br class="gmail_msg">
> +//===----------------------------------------------------------------------===//<br class="gmail_msg">
> +<br class="gmail_msg">
> +#include "llvm/ADT/SmallString.h"<br class="gmail_msg">
> +#include "llvm/ADT/Twine.h"<br class="gmail_msg">
> +<br class="gmail_msg">
> +#include "Windows/WindowsSupport.h"<br class="gmail_msg">
> +#include <process.h><br class="gmail_msg">
> +<br class="gmail_msg">
> +// Windows will at times define MemoryFence.<br class="gmail_msg">
> +#ifdef MemoryFence<br class="gmail_msg">
> +#undef MemoryFence<br class="gmail_msg">
> +#endif<br class="gmail_msg">
> +<br class="gmail_msg">
> +namespace {<br class="gmail_msg">
> + struct ThreadInfo {<br class="gmail_msg">
> + void(*func)(void*);<br class="gmail_msg">
> + void *param;<br class="gmail_msg">
> + };<br class="gmail_msg">
> +}<br class="gmail_msg">
> +<br class="gmail_msg">
> +static unsigned __stdcall ThreadCallback(void *param) {<br class="gmail_msg">
> + struct ThreadInfo *info = reinterpret_cast<struct ThreadInfo *>(param);<br class="gmail_msg">
> + info->func(info->param);<br class="gmail_msg">
> +<br class="gmail_msg">
> + return 0;<br class="gmail_msg">
> +}<br class="gmail_msg">
> +<br class="gmail_msg">
> +void llvm::llvm_execute_on_thread(void(*Fn)(void*), void *UserData,<br class="gmail_msg">
> + unsigned RequestedStackSize) {<br class="gmail_msg">
> + struct ThreadInfo param = { Fn, UserData };<br class="gmail_msg">
> +<br class="gmail_msg">
> + HANDLE hThread = (HANDLE)::_beginthreadex(NULL,<br class="gmail_msg">
> + RequestedStackSize, ThreadCallback,<br class="gmail_msg">
> + ¶m, 0, NULL);<br class="gmail_msg">
> +<br class="gmail_msg">
> + if (hThread) {<br class="gmail_msg">
> + // We actually don't care whether the wait succeeds or fails, in<br class="gmail_msg">
> + // the same way we don't care whether the pthread_join call succeeds<br class="gmail_msg">
> + // or fails. There's not much we could do if this were to fail. But<br class="gmail_msg">
> + // on success, this call will wait until the thread finishes executing<br class="gmail_msg">
> + // before returning.<br class="gmail_msg">
> + (void)::WaitForSingleObject(hThread, INFINITE);<br class="gmail_msg">
> + ::CloseHandle(hThread);<br class="gmail_msg">
> + }<br class="gmail_msg">
> +}<br class="gmail_msg">
> +<br class="gmail_msg">
> +uint64_t llvm::get_threadid() {<br class="gmail_msg">
> + return uint64_t(::GetCurrentThreadId());<br class="gmail_msg">
> +}<br class="gmail_msg">
> +<br class="gmail_msg">
> +void llvm::set_thread_name(const Twine &Name) {<br class="gmail_msg">
> +#if defined(_MSC_VER)<br class="gmail_msg">
> + // Make sure the input is null terminated.<br class="gmail_msg">
> + SmallString<64> Storage;<br class="gmail_msg">
> + StringRef NameStr = Name.toNullTerminatedStringRef(Storage);<br class="gmail_msg">
> + constexpr DWORD MS_VC_EXCEPTION = 0x406D1388;<br class="gmail_msg">
> +<br class="gmail_msg">
> +#pragma pack(push, 8)<br class="gmail_msg">
> + struct THREADNAME_INFO {<br class="gmail_msg">
> + DWORD dwType; // Must be 0x1000.<br class="gmail_msg">
> + LPCSTR szName; // Pointer to thread name<br class="gmail_msg">
> + DWORD dwThreadId; // Thread ID (-1 == current thread)<br class="gmail_msg">
> + DWORD dwFlags; // Reserved. Do not use.<br class="gmail_msg">
> + };<br class="gmail_msg">
> +#pragma pack(pop)<br class="gmail_msg">
> +<br class="gmail_msg">
> + THREADNAME_INFO info;<br class="gmail_msg">
> + info.dwType = 0x1000;<br class="gmail_msg">
> + info.szName = NameStr.data();<br class="gmail_msg">
> + info.dwThreadId = ::GetCurrentThreadId();<br class="gmail_msg">
> + info.dwFlags = 0;<br class="gmail_msg">
> +<br class="gmail_msg">
> + __try {<br class="gmail_msg">
> + ::RaiseException(MS_VC_EXCEPTION, 0, sizeof(info) / sizeof(ULONG_PTR),<br class="gmail_msg">
> + (ULONG_PTR *)&info);<br class="gmail_msg">
> + }<br class="gmail_msg">
> + __except (EXCEPTION_EXECUTE_HANDLER) {<br class="gmail_msg">
> + }<br class="gmail_msg">
> +#endif<br class="gmail_msg">
> +}<br class="gmail_msg">
> +<br class="gmail_msg">
> +void llvm::get_thread_name(SmallVectorImpl<char> &Name) {<br class="gmail_msg">
> + // "Name" is not an inherent property of a thread on Windows. In fact, when<br class="gmail_msg">
> + // you "set" the name, you are only firing a one-time message to a debugger<br class="gmail_msg">
> + // which it interprets as a program setting its threads' name. We may be<br class="gmail_msg">
> + // able to get fancy by creating a TLS entry when someone calls<br class="gmail_msg">
> + // set_thread_name so that subsequent calls to get_thread_name return this<br class="gmail_msg">
> + // value.<br class="gmail_msg">
> + Name.clear();<br class="gmail_msg">
> +}<br class="gmail_msg">
><br class="gmail_msg">
><br class="gmail_msg">
> _______________________________________________<br class="gmail_msg">
> llvm-commits mailing list<br class="gmail_msg">
> <a href="mailto:llvm-commits@lists.llvm.org" class="gmail_msg" target="_blank">llvm-commits@lists.llvm.org</a><br class="gmail_msg">
> <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" class="gmail_msg" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br class="gmail_msg">
><br class="gmail_msg">
<br class="gmail_msg">
--<br class="gmail_msg">
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,<br class="gmail_msg">
hosted by The Linux Foundation<br class="gmail_msg">
_______________________________________________<br class="gmail_msg">
llvm-commits mailing list<br class="gmail_msg">
<a href="mailto:llvm-commits@lists.llvm.org" class="gmail_msg" target="_blank">llvm-commits@lists.llvm.org</a><br class="gmail_msg">
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" class="gmail_msg" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br class="gmail_msg">
</blockquote></div>