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@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/ > CMakeLists.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/ > config.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/ > fallback_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/ > threading_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/ > test_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/ > test_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@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits