1 // RUN: %clangxx_tsan %s -o %t
2 // RUN: not %run %t 5 2>&1 | FileCheck %s
3 // RUN: not %run %t 10 2>&1 | FileCheck %s
4 // RUN: not %run %t 15 2>&1 | FileCheck %s
5 // RUN: not %run %t 20 2>&1 | FileCheck %s
6 // RUN: %run %t 30 2>&1 | FileCheck %s --check-prefix=CHECK-TOO-LONG-CYCLE
7 
8 #include <pthread.h>
9 #include <stdio.h>
10 #include <stdlib.h>
11 
main(int argc,char * argv[])12 int main(int argc, char *argv[]) {
13   int num_mutexes = 5;
14   if (argc > 1) num_mutexes = atoi(argv[1]);
15 
16   pthread_mutex_t m[num_mutexes];
17   for (int i = 0; i < num_mutexes; ++i)
18     pthread_mutex_init(&m[i], NULL);
19 
20   for (int i = 0; i < num_mutexes - 1; ++i) {
21     pthread_mutex_lock(&m[i]);
22     pthread_mutex_lock(&m[i + 1]);
23 
24     pthread_mutex_unlock(&m[i]);
25     pthread_mutex_unlock(&m[i + 1]);
26   }
27 
28   pthread_mutex_lock(&m[num_mutexes - 1]);
29   pthread_mutex_lock(&m[0]);
30 
31   pthread_mutex_unlock(&m[num_mutexes - 1]);
32   pthread_mutex_unlock(&m[0]);
33 
34   for (int i = 0; i < num_mutexes; ++i)
35     pthread_mutex_destroy(&m[i]);
36 
37   fprintf(stderr, "PASS\n");
38 }
39 
40 // CHECK: ThreadSanitizer: lock-order-inversion (potential deadlock)
41 // CHECK-TOO-LONG-CYCLE: WARNING: too long mutex cycle found
42 // CHECK: PASS
43