<div dir="ltr">Although I suppose checking for the existence of the functions would be even better. I don't have access to that kind of system though, so if it's easy and you think you can get a patch that checks for the existence of the functions in CMake, perhaps that would be better.</div><br><div class="gmail_quote"><div dir="ltr">On Fri, Mar 3, 2017 at 12:58 PM Zachary Turner <<a href="mailto:zturner@google.com">zturner@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">Can we can just check for glibc version inside of the #ifdef __linux__ branch and then do nothing if the glibc version is too small? </div><br class="gmail_msg"><div class="gmail_quote gmail_msg"><div dir="ltr" class="gmail_msg">On Fri, Mar 3, 2017 at 12:52 PM Krzysztof Parzyszek <<a href="mailto:kparzysz@codeaurora.org" class="gmail_msg" target="_blank">kparzysz@codeaurora.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">These are our local builds on SUSE 11.4 (glibc 2.11.3). The functions<br class="gmail_msg">
are pthread_setname_np and pthread_getname_np.<br class="gmail_msg">
<br class="gmail_msg">
It should be fine if the functions you added do nothing on that system,<br class="gmail_msg">
as long as the code compiles.<br class="gmail_msg">
<br class="gmail_msg">
If you don't have access to this kind of OS, I could come up with some<br class="gmail_msg">
patch (test for these functions in cmake).<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 2:42 PM, Zachary Turner wrote:<br class="gmail_msg">
> Which function does it not provide specifically? Can you link me to a<br class="gmail_msg">
> failing buildbot?<br class="gmail_msg">
><br class="gmail_msg">
> On Fri, Mar 3, 2017 at 11:01 AM Krzysztof Parzyszek via llvm-commits<br class="gmail_msg">
> <<a href="mailto:llvm-commits@lists.llvm.org" class="gmail_msg" target="_blank">llvm-commits@lists.llvm.org</a> <mailto:<a href="mailto:llvm-commits@lists.llvm.org" class="gmail_msg" target="_blank">llvm-commits@lists.llvm.org</a>>> wrote:<br class="gmail_msg">
><br class="gmail_msg">
> 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:<br class="gmail_msg">
> <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">
> ==============================================================================<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<br class="gmail_msg">
> 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<br class="gmail_msg">
> 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<br class="gmail_msg">
> separate<br class="gmail_msg">
> > - /// thread, passing it the provided \p UserData and waits for<br class="gmail_msg">
> thread<br class="gmail_msg">
> > - /// completion.<br class="gmail_msg">
> > - ///<br class="gmail_msg">
> > - /// This function does not guarantee that the code will<br class="gmail_msg">
> actually be executed<br class="gmail_msg">
> > - /// on a separate thread or honoring the requested stack size,<br class="gmail_msg">
> 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<br class="gmail_msg">
> (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<br class="gmail_msg">
> 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<br class="gmail_msg">
> 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<br class="gmail_msg">
> be executed<br class="gmail_msg">
> > +/// on a separate thread or honoring the requested stack size,<br class="gmail_msg">
> 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<br class="gmail_msg">
> 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<br class="gmail_msg">
> system calls.<br class="gmail_msg">
> > + /// Note that not all platforms guarantee that the value<br class="gmail_msg">
> returned will be<br class="gmail_msg">
> > + /// unique across the entire system, so portable code should<br class="gmail_msg">
> 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<br class="gmail_msg">
> thread's name can<br class="gmail_msg">
> > + /// be helpful for enabling useful diagnostics under a debugger<br class="gmail_msg">
> or when<br class="gmail_msg">
> > + /// logging. The level of support for setting a thread's name<br class="gmail_msg">
> varies<br class="gmail_msg">
> > + /// wildly across operating systems, and we only make a best<br class="gmail_msg">
> effort to<br class="gmail_msg">
> > + /// perform the operation on supported platforms. No<br class="gmail_msg">
> 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<br class="gmail_msg">
> support for<br class="gmail_msg">
> > + /// getting a thread's name varies wildly across operating<br class="gmail_msg">
> systems, and it<br class="gmail_msg">
> > + /// is not even guaranteed that if you can successfully set a<br class="gmail_msg">
> thread's name<br class="gmail_msg">
> > + /// that you can later get it back. This function is intended<br class="gmail_msg">
> for diagnostic<br class="gmail_msg">
> > + /// purposes, and as with setting a thread's name no indication<br class="gmail_msg">
> 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:<br class="gmail_msg">
> <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">
> ==============================================================================<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">
> +//===----------------------------------------------------------------------===//<br class="gmail_msg">
> > +//=== WARNING: Implementation here must contain only TRULY<br class="gmail_msg">
> operating system<br class="gmail_msg">
> > +//=== independent code.<br class="gmail_msg">
> ><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">
> \<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,<br class="gmail_msg">
> &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<br class="gmail_msg">
> *>(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,<br class="gmail_msg">
> 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<br class="gmail_msg">
> succeeds<br class="gmail_msg">
> > - // or fails. There's not much we could do if this were to<br class="gmail_msg">
> fail. But<br class="gmail_msg">
> > - // on success, this call will wait until the thread finishes<br class="gmail_msg">
> 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) {<br class="gmail_msg">
> 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:<br class="gmail_msg">
> <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">
> ==============================================================================<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 -----<br class="gmail_msg">
> -*- 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<br class="gmail_msg">
> 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">
> > +//<br class="gmail_msg">
> > +// This file provides the Unix specific implementation of<br class="gmail_msg">
> Threading functions.<br class="gmail_msg">
> > +//<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__) ||<br class="gmail_msg">
> 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,<br class="gmail_msg">
> &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<br class="gmail_msg">
> the thread<br class="gmail_msg">
> > + // port, so we need to deallocate it. mach_task_self() doesn't<br class="gmail_msg">
> 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)) ||<br class="gmail_msg">
> 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 |<br class="gmail_msg">
> 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 +<br class="gmail_msg">
> 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,<br class="gmail_msg">
> 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)) ||<br class="gmail_msg">
> 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,<br class="gmail_msg">
> 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:<br class="gmail_msg">
> <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">
> ==============================================================================<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<br class="gmail_msg">
> 11:15:17 2017<br class="gmail_msg">
> > @@ -0,0 +1,101 @@<br class="gmail_msg">
> > +//===- Windows/Threading.inc - Win32 Threading Implementation -<br class="gmail_msg">
> -*- 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<br class="gmail_msg">
> 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">
> > +//<br class="gmail_msg">
> > +// This file provides the Win32 specific implementation of<br class="gmail_msg">
> Threading functions.<br class="gmail_msg">
> > +//<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<br class="gmail_msg">
> *>(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<br class="gmail_msg">
> succeeds<br class="gmail_msg">
> > + // or fails. There's not much we could do if this were to<br class="gmail_msg">
> fail. But<br class="gmail_msg">
> > + // on success, this call will wait until the thread finishes<br class="gmail_msg">
> 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) /<br class="gmail_msg">
> 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.<br class="gmail_msg">
> In fact, when<br class="gmail_msg">
> > + // you "set" the name, you are only firing a one-time message<br class="gmail_msg">
> to a debugger<br class="gmail_msg">
> > + // which it interprets as a program setting its threads' name.<br class="gmail_msg">
> 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<br class="gmail_msg">
> 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> <mailto:<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> <mailto:<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">
</blockquote></div></blockquote></div>