1// RUN: %clangxx -O1 %s -o %t && %run %t
2// RUN: %clangxx -O1 -DUSE_GLIBC %s -o %t && %run %t
3// UNSUPPORTED: android
4
5#include <pthread.h>
6
7#if !defined(__GLIBC_PREREQ)
8#define __GLIBC_PREREQ(a, b) 0
9#endif
10
11#if defined(USE_GLIBC) && !__GLIBC_PREREQ(2, 34)
12// They were removed from GLIBC 2.34
13extern "C" int __pthread_mutex_lock(pthread_mutex_t *__mutex);
14extern "C" int __pthread_mutex_unlock(pthread_mutex_t *__mutex);
15#define LOCK __pthread_mutex_lock
16#define UNLOCK __pthread_mutex_unlock
17#else
18#define LOCK pthread_mutex_lock
19#define UNLOCK pthread_mutex_unlock
20#endif
21
22pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;
23int x;
24
25static void *Start(void *arg) {
26 LOCK(mutex: &m);
27 ++x;
28 UNLOCK(mutex: &m);
29 return nullptr;
30}
31
32int main() {
33 pthread_t threads[2] = {};
34 for (pthread_t &t : threads)
35 pthread_create(newthread: &t, attr: 0, start_routine: &Start, arg: 0);
36 for (pthread_t &t : threads)
37 pthread_join(th: t, thread_return: 0);
38 return 0;
39}
40

source code of compiler-rt/test/sanitizer_common/TestCases/Linux/pthread_mutex.cpp