[libcxxabi] r284128 - [libcxxabi] Refactor pthread usage into a separate API

Asiri Rathnayake via cfe-commits cfe-commits at lists.llvm.org
Thu Oct 13 11:53:52 PDT 2016


Should be fixed in r284141.

/ Asiri

On Thu, Oct 13, 2016 at 7:20 PM, Asiri Rathnayake <
asiri.rathnayake at gmail.com> wrote:

> Looks like this broke the gcc builder: http://lab.llvm.org:
> 8011/builders/libcxx-libcxxabi-x86_64-linux-ubuntu-
> gcc49-cxx11/builds/573/steps/build.libcxxabi/logs/stdio
>
> I'll have a look soon, might not be able to do so before tomorrow. Please
> feel free to revert if this is blocking.
>
> Sorry for the trouble.
>
> / Asiri
>
> On Thu, Oct 13, 2016 at 4:05 PM, Asiri Rathnayake via cfe-commits <
> cfe-commits at lists.llvm.org> wrote:
>
>> Author: asiri
>> Date: Thu Oct 13 10:05:19 2016
>> New Revision: 284128
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=284128&view=rev
>> Log:
>> [libcxxabi] Refactor pthread usage into a separate API
>>
>> This patch refactors all pthread uses of libc++abi into a separate API.
>> This
>> is the first step towards supporting an externlly-threaded libc++abi
>> library.
>>
>> I've followed the conventions already used in the libc++ library for the
>> same
>> purpose.
>>
>> Patch from: Saleem Abdulrasool and Asiri Rathnayake
>>
>> Reviewed by: compnerd, EricWF
>>
>> Differential revisions:
>>   https://reviews.llvm.org/D18482 (original)
>>   https://reviews.llvm.org/D24864 (final)
>>
>> Added:
>>     libcxxabi/trunk/src/threading_support.h
>> Modified:
>>     libcxxabi/trunk/CMakeLists.txt
>>     libcxxabi/trunk/src/config.h
>>     libcxxabi/trunk/src/cxa_exception.cpp
>>     libcxxabi/trunk/src/cxa_exception_storage.cpp
>>     libcxxabi/trunk/src/cxa_guard.cpp
>>     libcxxabi/trunk/src/cxa_thread_atexit.cpp
>>     libcxxabi/trunk/src/fallback_malloc.cpp
>>     libcxxabi/trunk/test/test_exception_storage.pass.cpp
>>     libcxxabi/trunk/test/test_fallback_malloc.pass.cpp
>>
>> Modified: libcxxabi/trunk/CMakeLists.txt
>> URL: http://llvm.org/viewvc/llvm-project/libcxxabi/trunk/CMakeLis
>> ts.txt?rev=284128&r1=284127&r2=284128&view=diff
>> ============================================================
>> ==================
>> --- libcxxabi/trunk/CMakeLists.txt (original)
>> +++ libcxxabi/trunk/CMakeLists.txt Thu Oct 13 10:05:19 2016
>> @@ -340,6 +340,7 @@ endif()
>>
>>  if (LIBCXXABI_HAS_PTHREAD_API)
>>    add_definitions(-D_LIBCPP_HAS_THREAD_API_PTHREAD)
>> +  add_definitions(-D_LIBCXXABI_USE_THREAD_API_PTHREAD)
>>  endif()
>>
>>  if (MSVC)
>>
>> Modified: libcxxabi/trunk/src/config.h
>> URL: http://llvm.org/viewvc/llvm-project/libcxxabi/trunk/src/conf
>> ig.h?rev=284128&r1=284127&r2=284128&view=diff
>> ============================================================
>> ==================
>> --- libcxxabi/trunk/src/config.h (original)
>> +++ libcxxabi/trunk/src/config.h Thu Oct 13 10:05:19 2016
>> @@ -16,6 +16,36 @@
>>
>>  #include <unistd.h>
>>
>> +// Configure inline visibility attributes
>> +#if defined(_WIN32)
>> + #if defined(_MSC_VER) && !defined(__clang__)
>> +  // Using Microsoft Visual C++ compiler
>> +  #define _LIBCXXABI_INLINE_VISIBILITY __forceinline
>> + #else
>> +  #if __has_attribute(__internal_linkage__)
>> +   #define _LIBCXXABI_INLINE_VISIBILITY __attribute__
>> ((__internal_linkage__, __always_inline__))
>> +  #else
>> +   #define _LIBCXXABI_INLINE_VISIBILITY __attribute__
>> ((__always_inline__))
>> +  #endif
>> + #endif
>> +#else
>> + #if __has_attribute(__internal_linkage__)
>> +  #define _LIBCXXABI_INLINE_VISIBILITY __attribute__
>> ((__internal_linkage__, __always_inline__))
>> + #else
>> +  #define _LIBCXXABI_INLINE_VISIBILITY __attribute__
>> ((__visibility__("hidden"), __always_inline__))
>> + #endif
>> +#endif
>> +
>> +// Try and deduce a threading api if one has not been explicitly set.
>> +#if !defined(_LIBCXXABI_HAS_NO_THREADS) && \
>> +    !defined(_LIBCXXABI_USE_THREAD_API_PTHREAD)
>> +  #if defined(_POSIX_THREADS) && _POSIX_THREADS >= 0
>> +    #define _LIBCXXABI_USE_THREAD_API_PTHREAD
>> +  #else
>> +    #error "No thread API"
>> +  #endif
>> +#endif
>> +
>>  // Set this in the CXXFLAGS when you need it, because otherwise we'd
>> have to
>>  // #if !defined(__linux__) && !defined(__APPLE__) && ...
>>  // and so-on for *every* platform.
>>
>> Modified: libcxxabi/trunk/src/cxa_exception.cpp
>> URL: http://llvm.org/viewvc/llvm-project/libcxxabi/trunk/src/cxa_
>> exception.cpp?rev=284128&r1=284127&r2=284128&view=diff
>> ============================================================
>> ==================
>> --- libcxxabi/trunk/src/cxa_exception.cpp (original)
>> +++ libcxxabi/trunk/src/cxa_exception.cpp Thu Oct 13 10:05:19 2016
>> @@ -12,6 +12,7 @@
>>  //===------------------------------------------------------
>> ----------------===//
>>
>>  #include "config.h"
>> +#include "threading_support.h"
>>  #include "cxxabi.h"
>>
>>  #include <exception>        // for std::terminate
>>
>> Modified: libcxxabi/trunk/src/cxa_exception_storage.cpp
>> URL: http://llvm.org/viewvc/llvm-project/libcxxabi/trunk/src/cxa_
>> exception_storage.cpp?rev=284128&r1=284127&r2=284128&view=diff
>> ============================================================
>> ==================
>> --- libcxxabi/trunk/src/cxa_exception_storage.cpp (original)
>> +++ libcxxabi/trunk/src/cxa_exception_storage.cpp Thu Oct 13 10:05:19
>> 2016
>> @@ -14,6 +14,7 @@
>>  #include "cxa_exception.hpp"
>>
>>  #include "config.h"
>> +#include "threading_support.h"
>>
>>  #if defined(_LIBCXXABI_HAS_NO_THREADS)
>>
>> @@ -44,28 +45,27 @@ extern "C" {
>>
>>  #else
>>
>> -#include <pthread.h>
>>  #include "abort_message.h"
>>  #include "fallback_malloc.h"
>>
>> -//  In general, we treat all pthread errors as fatal.
>> +//  In general, we treat all threading errors as fatal.
>>  //  We cannot call std::terminate() because that will in turn
>>  //  call __cxa_get_globals() and cause infinite recursion.
>>
>>  namespace __cxxabiv1 {
>>  namespace {
>> -    pthread_key_t  key_;
>> -    pthread_once_t flag_ = PTHREAD_ONCE_INIT;
>> +    __libcxxabi_tls_key key_;
>> +    __libcxxabi_exec_once_flag flag_ = _LIBCXXABI_EXEC_ONCE_INITIALIZER;
>>
>>      void destruct_ (void *p) {
>>          __free_with_fallback ( p );
>> -        if ( 0 != ::pthread_setspecific ( key_, NULL ) )
>> +        if ( 0 != __libcxxabi_tls_set ( key_, NULL ) )
>>              abort_message("cannot zero out thread value for
>> __cxa_get_globals()");
>>          }
>>
>>      void construct_ () {
>> -        if ( 0 != pthread_key_create ( &key_, destruct_ ) )
>> -            abort_message("cannot create pthread key for
>> __cxa_get_globals()");
>> +        if ( 0 != __libcxxabi_tls_create ( &key_, destruct_ ) )
>> +            abort_message("cannot create thread specific key for
>> __cxa_get_globals()");
>>          }
>>  }
>>
>> @@ -80,8 +80,8 @@ extern "C" {
>>                          (__calloc_with_fallback (1, sizeof
>> (__cxa_eh_globals)));
>>              if ( NULL == retVal )
>>                  abort_message("cannot allocate __cxa_eh_globals");
>> -            if ( 0 != pthread_setspecific ( key_, retVal ) )
>> -               abort_message("pthread_setspecific failure in
>> __cxa_get_globals()");
>> +            if ( 0 != __libcxxabi_tls_set ( key_, retVal ) )
>> +               abort_message("__libcxxabi_tls_set failure in
>> __cxa_get_globals()");
>>             }
>>          return retVal;
>>          }
>> @@ -92,10 +92,10 @@ extern "C" {
>>      // libc++abi.
>>      __cxa_eh_globals * __cxa_get_globals_fast () {
>>      //  First time through, create the key.
>> -        if (0 != pthread_once(&flag_, construct_))
>> -            abort_message("pthread_once failure in
>> __cxa_get_globals_fast()");
>> +        if (0 != __libcxxabi_execute_once(&flag_, construct_))
>> +            abort_message("execute once failure in
>> __cxa_get_globals_fast()");
>>  //        static int init = construct_();
>> -        return static_cast<__cxa_eh_globals*>
>> (::pthread_getspecific(key_));
>> +        return static_cast<__cxa_eh_globals*>
>> (__libcxxabi_tls_get(key_));
>>          }
>>
>>  }
>>
>> Modified: libcxxabi/trunk/src/cxa_guard.cpp
>> URL: http://llvm.org/viewvc/llvm-project/libcxxabi/trunk/src/cxa_
>> guard.cpp?rev=284128&r1=284127&r2=284128&view=diff
>> ============================================================
>> ==================
>> --- libcxxabi/trunk/src/cxa_guard.cpp (original)
>> +++ libcxxabi/trunk/src/cxa_guard.cpp Thu Oct 13 10:05:19 2016
>> @@ -11,10 +11,8 @@
>>
>>  #include "abort_message.h"
>>  #include "config.h"
>> +#include "threading_support.h"
>>
>> -#ifndef _LIBCXXABI_HAS_NO_THREADS
>> -#  include <pthread.h>
>> -#endif
>>  #include <stdint.h>
>>
>>  /*
>> @@ -22,9 +20,9 @@
>>      which will turn around and try to call __cxa_guard_acquire
>> reentrantly.
>>      For this reason, the headers of this file are as restricted as
>> possible.
>>      Previous implementations of this code for __APPLE__ have used
>> -    pthread_mutex_lock and the abort_message utility without problem.
>> This
>> -    implementation also uses pthread_cond_wait which has tested to not
>> be a
>> -    problem.
>> +    __libcxxabi_mutex_lock and the abort_message utility without
>> problem.  This
>> +    implementation also uses __libcxxabi_condvar_wait which has tested
>> +    to not be a problem.
>>  */
>>
>>  namespace __cxxabiv1
>> @@ -69,8 +67,8 @@ bool is_initialized(guard_type* guard_ob
>>  #endif
>>
>>  #ifndef _LIBCXXABI_HAS_NO_THREADS
>> -pthread_mutex_t guard_mut = PTHREAD_MUTEX_INITIALIZER;
>> -pthread_cond_t  guard_cv  = PTHREAD_COND_INITIALIZER;
>> +__libcxxabi_mutex_t guard_mut = _LIBCXXABI_MUTEX_INITIALIZER;
>> +__libcxxabi_condvar_t guard_cv = _LIBCXXABI_CONDVAR_INITIALIZER;
>>  #endif
>>
>>  #if defined(__APPLE__) && !defined(__arm__)
>> @@ -175,13 +173,13 @@ extern "C"
>>  #ifndef _LIBCXXABI_HAS_NO_THREADS
>>  _LIBCXXABI_FUNC_VIS int __cxa_guard_acquire(guard_type *guard_object) {
>>      char* initialized = (char*)guard_object;
>> -    if (pthread_mutex_lock(&guard_mut))
>> +    if (__libcxxabi_mutex_lock(&guard_mut))
>>          abort_message("__cxa_guard_acquire failed to acquire mutex");
>>      int result = *initialized == 0;
>>      if (result)
>>      {
>>  #if defined(__APPLE__) && !defined(__arm__)
>> -        const lock_type id = pthread_mach_thread_np(pthread_self());
>> +        const lock_type id = __libcxxabi_thread_get_port();
>>          lock_type lock = get_lock(*guard_object);
>>          if (lock)
>>          {
>> @@ -190,7 +188,7 @@ _LIBCXXABI_FUNC_VIS int __cxa_guard_acqu
>>                  abort_message("__cxa_guard_acquire detected deadlock");
>>              do
>>              {
>> -                if (pthread_cond_wait(&guard_cv, &guard_mut))
>> +                if (__libcxxabi_condvar_wait(&guard_cv, &guard_mut))
>>                      abort_message("__cxa_guard_acquire condition
>> variable wait failed");
>>                  lock = get_lock(*guard_object);
>>              } while (lock);
>> @@ -202,36 +200,36 @@ _LIBCXXABI_FUNC_VIS int __cxa_guard_acqu
>>              set_lock(*guard_object, id);
>>  #else  // !__APPLE__ || __arm__
>>          while (get_lock(*guard_object))
>> -            if (pthread_cond_wait(&guard_cv, &guard_mut))
>> +            if (__libcxxabi_condvar_wait(&guard_cv, &guard_mut))
>>                  abort_message("__cxa_guard_acquire condition variable
>> wait failed");
>>          result = *initialized == 0;
>>          if (result)
>>              set_lock(*guard_object, true);
>>  #endif  // !__APPLE__ || __arm__
>>      }
>> -    if (pthread_mutex_unlock(&guard_mut))
>> +    if (__libcxxabi_mutex_unlock(&guard_mut))
>>          abort_message("__cxa_guard_acquire failed to release mutex");
>>      return result;
>>  }
>>
>>  _LIBCXXABI_FUNC_VIS void __cxa_guard_release(guard_type *guard_object) {
>> -    if (pthread_mutex_lock(&guard_mut))
>> +    if (__libcxxabi_mutex_lock(&guard_mut))
>>          abort_message("__cxa_guard_release failed to acquire mutex");
>>      *guard_object = 0;
>>      set_initialized(guard_object);
>> -    if (pthread_mutex_unlock(&guard_mut))
>> +    if (__libcxxabi_mutex_unlock(&guard_mut))
>>          abort_message("__cxa_guard_release failed to release mutex");
>> -    if (pthread_cond_broadcast(&guard_cv))
>> +    if (__libcxxabi_condvar_broadcast(&guard_cv))
>>          abort_message("__cxa_guard_release failed to broadcast
>> condition variable");
>>  }
>>
>>  _LIBCXXABI_FUNC_VIS void __cxa_guard_abort(guard_type *guard_object) {
>> -    if (pthread_mutex_lock(&guard_mut))
>> +    if (__libcxxabi_mutex_lock(&guard_mut))
>>          abort_message("__cxa_guard_abort failed to acquire mutex");
>>      *guard_object = 0;
>> -    if (pthread_mutex_unlock(&guard_mut))
>> +    if (__libcxxabi_mutex_unlock(&guard_mut))
>>          abort_message("__cxa_guard_abort failed to release mutex");
>> -    if (pthread_cond_broadcast(&guard_cv))
>> +    if (__libcxxabi_condvar_broadcast(&guard_cv))
>>          abort_message("__cxa_guard_abort failed to broadcast condition
>> variable");
>>  }
>>
>>
>> Modified: libcxxabi/trunk/src/cxa_thread_atexit.cpp
>> URL: http://llvm.org/viewvc/llvm-project/libcxxabi/trunk/src/cxa_
>> thread_atexit.cpp?rev=284128&r1=284127&r2=284128&view=diff
>> ============================================================
>> ==================
>> --- libcxxabi/trunk/src/cxa_thread_atexit.cpp (original)
>> +++ libcxxabi/trunk/src/cxa_thread_atexit.cpp Thu Oct 13 10:05:19 2016
>> @@ -9,8 +9,8 @@
>>
>>  #include "abort_message.h"
>>  #include "cxxabi.h"
>> +#include "threading_support.h"
>>  #include <cstdlib>
>> -#include <pthread.h>
>>
>>  namespace __cxxabiv1 {
>>
>> @@ -39,9 +39,10 @@ namespace {
>>    //   destructors of any objects with static storage duration.
>>    //
>>    // - thread_local destructors on non-main threads run on the first
>> iteration
>> -  //   through the pthread_key destructors.
>> std::notify_all_at_thread_exit()
>> -  //   and similar functions must be careful to wait until the second
>> iteration
>> -  //   to provide their intended ordering guarantees.
>> +  //   through the __libcxxabi_tls_key destructors.
>> +  //   std::notify_all_at_thread_exit() and similar functions must be
>> careful to
>> +  //   wait until the second iteration to provide their intended ordering
>> +  //   guarantees.
>>    //
>>    // Another limitation, though one shared with ..._impl(), is that any
>>    // thread_locals that are first initialized after non-thread_local
>> global
>> @@ -65,7 +66,7 @@ namespace {
>>    // True if the destructors are currently scheduled to run on this
>> thread
>>    __thread bool dtors_alive = false;
>>    // Used to trigger destructors on thread exit; value is ignored
>> -  pthread_key_t dtors_key;
>> +  __libcxxabi_tls_key dtors_key;
>>
>>    void run_dtors(void*) {
>>      while (auto head = dtors) {
>> @@ -79,16 +80,16 @@ namespace {
>>
>>    struct DtorsManager {
>>      DtorsManager() {
>> -      // There is intentionally no matching pthread_key_delete call, as
>> +      // There is intentionally no matching __libcxxabi_tls_delete call,
>> as
>>        // __cxa_thread_atexit() may be called arbitrarily late (for
>> example, from
>>        // global destructors or atexit() handlers).
>> -      if (pthread_key_create(&dtors_key, run_dtors) != 0) {
>> -        abort_message("pthread_key_create() failed in
>> __cxa_thread_atexit()");
>> +      if (__libcxxabi_tls_create(&dtors_key, run_dtors) != 0) {
>> +        abort_message("__libcxxabi_tls_create() failed in
>> __cxa_thread_atexit()");
>>        }
>>      }
>>
>>      ~DtorsManager() {
>> -      // pthread_key destructors do not run on threads that call exit()
>> +      // __libcxxabi_tls_key destructors do not run on threads that call
>> exit()
>>        // (including when the main thread returns from main()), so we
>> explicitly
>>        // call the destructor here.  This runs at exit time (potentially
>> earlier
>>        // if libc++abi is dlclose()'d).  Any thread_locals initialized
>> after this
>> @@ -109,12 +110,12 @@ extern "C" {
>>      if (__cxa_thread_atexit_impl) {
>>        return __cxa_thread_atexit_impl(dtor, obj, dso_symbol);
>>      } else {
>> -      // Initialize the dtors pthread_key (uses __cxa_guard_*() for
>> one-time
>> -      // initialization and __cxa_atexit() for destruction)
>> +      // Initialize the dtors __libcxxabi_tls_key (uses __cxa_guard_*()
>> for
>> +      // one-time initialization and __cxa_atexit() for destruction)
>>        static DtorsManager manager;
>>
>>        if (!dtors_alive) {
>> -        if (pthread_setspecific(dtors_key, &dtors_key) != 0) {
>> +        if (__libcxxabi_tls_set(dtors_key, &dtors_key) != 0) {
>>            return -1;
>>          }
>>          dtors_alive = true;
>>
>> Modified: libcxxabi/trunk/src/fallback_malloc.cpp
>> URL: http://llvm.org/viewvc/llvm-project/libcxxabi/trunk/src/fall
>> back_malloc.cpp?rev=284128&r1=284127&r2=284128&view=diff
>> ============================================================
>> ==================
>> --- libcxxabi/trunk/src/fallback_malloc.cpp (original)
>> +++ libcxxabi/trunk/src/fallback_malloc.cpp Thu Oct 13 10:05:19 2016
>> @@ -10,14 +10,11 @@
>>  #include "fallback_malloc.h"
>>
>>  #include "config.h"
>> +#include "threading_support.h"
>>
>>  #include <cstdlib> // for malloc, calloc, free
>>  #include <cstring> // for memset
>>
>> -#ifndef _LIBCXXABI_HAS_NO_THREADS
>> -#include <pthread.h> // for mutexes
>> -#endif
>> -
>>  //  A small, simple heap manager based (loosely) on
>>  //  the startup heap manager from FreeBSD, optimized for space.
>>  //
>> @@ -32,7 +29,7 @@ namespace {
>>
>>  // When POSIX threads are not available, make the mutex operations a nop
>>  #ifndef _LIBCXXABI_HAS_NO_THREADS
>> -static pthread_mutex_t heap_mutex = PTHREAD_MUTEX_INITIALIZER;
>> +static __libcxxabi_mutex_t heap_mutex = _LIBCXXABI_MUTEX_INITIALIZER;
>>  #else
>>  static void * heap_mutex = 0;
>>  #endif
>> @@ -40,8 +37,8 @@ static void * heap_mutex = 0;
>>  class mutexor {
>>  public:
>>  #ifndef _LIBCXXABI_HAS_NO_THREADS
>> -    mutexor ( pthread_mutex_t *m ) : mtx_(m) { pthread_mutex_lock ( mtx_
>> ); }
>> -    ~mutexor () { pthread_mutex_unlock ( mtx_ ); }
>> +    mutexor ( __libcxxabi_mutex_t *m ) : mtx_(m) {
>> __libcxxabi_mutex_lock ( mtx_ ); }
>> +    ~mutexor () { __libcxxabi_mutex_unlock ( mtx_ ); }
>>  #else
>>      mutexor ( void * ) {}
>>      ~mutexor () {}
>> @@ -50,7 +47,7 @@ private:
>>      mutexor ( const mutexor &rhs );
>>      mutexor & operator = ( const mutexor &rhs );
>>  #ifndef _LIBCXXABI_HAS_NO_THREADS
>> -    pthread_mutex_t *mtx_;
>> +    __libcxxabi_mutex_t *mtx_;
>>  #endif
>>      };
>>
>>
>> Added: libcxxabi/trunk/src/threading_support.h
>> URL: http://llvm.org/viewvc/llvm-project/libcxxabi/trunk/src/thre
>> ading_support.h?rev=284128&view=auto
>> ============================================================
>> ==================
>> --- libcxxabi/trunk/src/threading_support.h (added)
>> +++ libcxxabi/trunk/src/threading_support.h Thu Oct 13 10:05:19 2016
>> @@ -0,0 +1,107 @@
>> +//===------------------------ threading_support.h
>> -------------------------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is dual licensed under the MIT and the University of
>> Illinois Open
>> +// Source Licenses. See LICENSE.TXT for details.
>> +//
>> +//===------------------------------------------------------
>> ----------------===//
>> +
>> +#ifndef _LIBCXXABI_THREADING_SUPPORT_H
>> +#define _LIBCXXABI_THREADING_SUPPORT_H
>> +
>> +#include "__cxxabi_config.h"
>> +#include "config.h"
>> +
>> +#ifndef _LIBCXXABI_HAS_NO_THREADS
>> +
>> +#if defined(_LIBCXXABI_USE_THREAD_API_PTHREAD)
>> +#include <pthread.h>
>> +
>> +#define _LIBCXXABI_THREAD_ABI_VISIBILITY inline
>> _LIBCXXABI_INLINE_VISIBILITY
>> +
>> +// Mutex
>> +typedef pthread_mutex_t __libcxxabi_mutex_t;
>> +#define _LIBCXXABI_MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER
>> +
>> +_LIBCXXABI_THREAD_ABI_VISIBILITY
>> +int __libcxxabi_mutex_lock(__libcxxabi_mutex_t *mutex) {
>> +  return pthread_mutex_lock(mutex);
>> +}
>> +
>> +_LIBCXXABI_THREAD_ABI_VISIBILITY
>> +int __libcxxabi_mutex_unlock(__libcxxabi_mutex_t *mutex) {
>> +  return pthread_mutex_unlock(mutex);
>> +}
>> +
>> +// Condition variable
>> +typedef pthread_cond_t __libcxxabi_condvar_t;
>> +#define _LIBCXXABI_CONDVAR_INITIALIZER PTHREAD_COND_INITIALIZER
>> +
>> +_LIBCXXABI_THREAD_ABI_VISIBILITY
>> +int __libcxxabi_condvar_wait(__libcxxabi_condvar_t *cv,
>> +                             __libcxxabi_mutex_t *mutex) {
>> +  return pthread_cond_wait(cv, mutex);
>> +}
>> +
>> +_LIBCXXABI_THREAD_ABI_VISIBILITY
>> +int __libcxxabi_condvar_broadcast(__libcxxabi_condvar_t *cv) {
>> +  return pthread_cond_broadcast(cv);
>> +}
>> +
>> +// Execute once
>> +typedef pthread_once_t __libcxxabi_exec_once_flag;
>> +#define _LIBCXXABI_EXEC_ONCE_INITIALIZER PTHREAD_ONCE_INIT
>> +
>> +_LIBCXXABI_THREAD_ABI_VISIBILITY
>> +int __libcxxabi_execute_once(__libcxxabi_exec_once_flag *flag,
>> +                             void (*init_routine)(void)) {
>> +  return pthread_once(flag, init_routine);
>> +}
>> +
>> +// Thread id
>> +#if defined(__APPLE__) && !defined(__arm__)
>> +_LIBCXXABI_THREAD_ABI_VISIBILITY
>> +mach_port_t __libcxxabi_thread_get_port()
>> +{
>> +    return pthread_mach_thread_np(pthread_self());
>> +}
>> +#endif
>> +
>> +// Thread
>> +typedef pthread_t __libcxxabi_thread_t;
>> +
>> +_LIBCXXABI_THREAD_ABI_VISIBILITY
>> +int __libcxxabi_thread_create(__libcxxabi_thread_t* __t,
>> +                           void* (*__func)(void*), void* __arg)
>> +{
>> +    return pthread_create(__t, 0, __func, __arg);
>> +}
>> +
>> +_LIBCXXABI_THREAD_ABI_VISIBILITY
>> +int __libcxxabi_thread_join(__libcxxabi_thread_t* __t)
>> +{
>> +    return pthread_join(*__t, 0);
>> +}
>> +
>> +// TLS
>> +typedef pthread_key_t __libcxxabi_tls_key;
>> +
>> +_LIBCXXABI_THREAD_ABI_VISIBILITY
>> +int __libcxxabi_tls_create(__libcxxabi_tls_key *key,
>> +                           void (*destructor)(void *)) {
>> +  return pthread_key_create(key, destructor);
>> +}
>> +
>> +_LIBCXXABI_THREAD_ABI_VISIBILITY
>> +void *__libcxxabi_tls_get(__libcxxabi_tls_key key) {
>> +  return pthread_getspecific(key);
>> +}
>> +
>> +_LIBCXXABI_THREAD_ABI_VISIBILITY
>> +int __libcxxabi_tls_set(__libcxxabi_tls_key key, void *value) {
>> +  return pthread_setspecific(key, value);
>> +}
>> +#endif // _LIBCXXABI_USE_THREAD_API_PTHREAD
>> +#endif // !_LIBCXXABI_HAS_NO_THREADS
>> +#endif // _LIBCXXABI_THREADING_SUPPORT_H
>>
>> Modified: libcxxabi/trunk/test/test_exception_storage.pass.cpp
>> URL: http://llvm.org/viewvc/llvm-project/libcxxabi/trunk/test/tes
>> t_exception_storage.pass.cpp?rev=284128&r1=284127&r2=284128&view=diff
>> ============================================================
>> ==================
>> --- libcxxabi/trunk/test/test_exception_storage.pass.cpp (original)
>> +++ libcxxabi/trunk/test/test_exception_storage.pass.cpp Thu Oct 13
>> 10:05:19 2016
>> @@ -12,9 +12,7 @@
>>  #include <cstdlib>
>>  #include <algorithm>
>>  #include <iostream>
>> -#ifndef _LIBCXXABI_HAS_NO_THREADS
>> -#  include <pthread.h>
>> -#endif
>> +#include "../src/threading_support.h"
>>  #include <unistd.h>
>>
>>  #include "../src/cxa_exception.hpp"
>> @@ -40,8 +38,8 @@ void *thread_code (void *parm) {
>>
>>  #ifndef _LIBCXXABI_HAS_NO_THREADS
>>  #define NUMTHREADS  10
>> -size_t      thread_globals [ NUMTHREADS ] = { 0 };
>> -pthread_t   threads        [ NUMTHREADS ];
>> +size_t                 thread_globals [ NUMTHREADS ] = { 0 };
>> +__libcxxabi_thread_t   threads        [ NUMTHREADS ];
>>  #endif
>>
>>  int main ( int argc, char *argv [] ) {
>> @@ -50,9 +48,9 @@ int main ( int argc, char *argv [] ) {
>>  #ifndef _LIBCXXABI_HAS_NO_THREADS
>>  //  Make the threads, let them run, and wait for them to finish
>>      for ( int i = 0; i < NUMTHREADS; ++i )
>> -        pthread_create( threads + i, NULL, thread_code, (void *)
>> (thread_globals + i));
>> +        __libcxxabi_thread_create ( threads + i, thread_code, (void *)
>> (thread_globals + i));
>>      for ( int i = 0; i < NUMTHREADS; ++i )
>> -        pthread_join ( threads [ i ], NULL );
>> +        __libcxxabi_thread_join ( &threads [ i ] );
>>
>>      for ( int i = 0; i < NUMTHREADS; ++i )
>>          if ( 0 == thread_globals [ i ] ) {
>>
>> Modified: libcxxabi/trunk/test/test_fallback_malloc.pass.cpp
>> URL: http://llvm.org/viewvc/llvm-project/libcxxabi/trunk/test/tes
>> t_fallback_malloc.pass.cpp?rev=284128&r1=284127&r2=284128&view=diff
>> ============================================================
>> ==================
>> --- libcxxabi/trunk/test/test_fallback_malloc.pass.cpp (original)
>> +++ libcxxabi/trunk/test/test_fallback_malloc.pass.cpp Thu Oct 13
>> 10:05:19 2016
>> @@ -10,7 +10,7 @@
>>  #include <iostream>
>>  #include <deque>
>>
>> -#include <pthread.h>
>> +#include "../src/threading_support.h"
>>
>>  typedef std::deque<void *> container;
>>
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20161013/11ba8df4/attachment-0001.html>


More information about the cfe-commits mailing list