xref: /llvm-project/compiler-rt/test/sanitizer_common/TestCases/Linux/pthread_mutex.cpp (revision dd87c5b322684b072e9df3058b84d09a702a1ea4)
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 Weber static 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 Weber int 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