<div dir="ltr">All of the linux bots have been fixed.  There's still 1 or 2 broken FreeBSD bots, I have a fix incoming for those.</div><br><div class="gmail_quote"><div dir="ltr">On Fri, Mar 3, 2017 at 10:27 AM Mike Aizatsky <<a href="mailto:aizatsky@google.com">aizatsky@google.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="gmail_msg">Zachary,<div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">I think this breaks multiple bots:</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg"><a href="http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-fast/builds/3224" class="gmail_msg" target="_blank">http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-fast/builds/3224</a><br class="gmail_msg"></div><div class="gmail_msg"><a href="http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux/builds/1002" class="gmail_msg" target="_blank">http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux/builds/1002</a><br class="gmail_msg"></div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">Could you take a look?</div></div><br class="gmail_msg"><div class="gmail_quote gmail_msg"><div dir="ltr" class="gmail_msg">On Fri, Mar 3, 2017 at 9:27 AM Zachary Turner via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org" class="gmail_msg" target="_blank">llvm-commits@lists.llvm.org</a>> wrote:<br class="gmail_msg"></div><blockquote class="gmail_quote gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">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">
</blockquote></div><div dir="ltr" class="gmail_msg">-- <br class="gmail_msg"></div><div data-smartmail="gmail_signature" class="gmail_msg"><div dir="ltr" class="gmail_msg">Mike<br class="gmail_msg">Sent from phone</div></div>
</blockquote></div>