1*dd87c5b3SVitaly Buka // RUN: %clangxx -O1 %s -o %t && %run %t 2*dd87c5b3SVitaly Buka // RUN: %clangxx -O1 -DUSE_GLIBC %s -o %t && %run %t 374989affSNico Weber // UNSUPPORTED: android 474989affSNico Weber 574989affSNico Weber #include <pthread.h> 674989affSNico Weber 7e60b3fceSVitaly Buka #if !defined(__GLIBC_PREREQ) 8e60b3fceSVitaly Buka #define __GLIBC_PREREQ(a, b) 0 9e60b3fceSVitaly Buka #endif 10e60b3fceSVitaly Buka 11e60b3fceSVitaly Buka #if defined(USE_GLIBC) && !__GLIBC_PREREQ(2, 34) 12e60b3fceSVitaly Buka // They were removed from GLIBC 2.34 1374989affSNico Weber extern "C" int __pthread_mutex_lock(pthread_mutex_t *__mutex); 1474989affSNico Weber extern "C" int __pthread_mutex_unlock(pthread_mutex_t *__mutex); 1574989affSNico Weber #define LOCK __pthread_mutex_lock 1674989affSNico Weber #define UNLOCK __pthread_mutex_unlock 1774989affSNico Weber #else 1874989affSNico Weber #define LOCK pthread_mutex_lock 1974989affSNico Weber #define UNLOCK pthread_mutex_unlock 2074989affSNico Weber #endif 2174989affSNico Weber 2274989affSNico Weber pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER; 2374989affSNico Weber int x; 2474989affSNico Weber Start(void * arg)2574989affSNico Weberstatic void *Start(void *arg) { 2674989affSNico Weber LOCK(&m); 2774989affSNico Weber ++x; 2874989affSNico Weber UNLOCK(&m); 2974989affSNico Weber return nullptr; 3074989affSNico Weber } 3174989affSNico Weber main()3274989affSNico Weberint main() { 3374989affSNico Weber pthread_t threads[2] = {}; 3474989affSNico Weber for (pthread_t &t : threads) 3574989affSNico Weber pthread_create(&t, 0, &Start, 0); 3674989affSNico Weber for (pthread_t &t : threads) 3774989affSNico Weber pthread_join(t, 0); 3874989affSNico Weber return 0; 3974989affSNico Weber } 40