<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">
> -                                            &param, 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">
> +    &param, 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>