Home | History | Annotate | Download | only in tsan
      1 // RUN: %clangxx_tsan %s -o %t
      2 // RUN:                                 not %run %t 2>&1 | FileCheck %s
      3 // RUN: %env_tsan_opts=detect_deadlocks=1 not %run %t 2>&1 | FileCheck %s
      4 // RUN: %env_tsan_opts=detect_deadlocks=0     %run %t 2>&1 | FileCheck %s --check-prefix=DISABLED
      5 // RUN: echo "deadlock:main" > %t.supp
      6 // RUN: %env_tsan_opts=suppressions='%t.supp' %run %t 2>&1 | FileCheck %s --check-prefix=DISABLED
      7 // RUN: echo "deadlock:zzzz" > %t.supp
      8 // RUN: %env_tsan_opts=suppressions='%t.supp' not %run %t 2>&1 | FileCheck %s
      9 #include <pthread.h>
     10 #include <stdio.h>
     11 
     12 int main() {
     13   pthread_mutex_t mu1, mu2;
     14   pthread_mutex_init(&mu1, NULL);
     15   pthread_mutex_init(&mu2, NULL);
     16 
     17   // mu1 => mu2
     18   pthread_mutex_lock(&mu1);
     19   pthread_mutex_lock(&mu2);
     20   pthread_mutex_unlock(&mu2);
     21   pthread_mutex_unlock(&mu1);
     22 
     23   // mu2 => mu1
     24   pthread_mutex_lock(&mu2);
     25   pthread_mutex_lock(&mu1);
     26   // CHECK: ThreadSanitizer: lock-order-inversion (potential deadlock)
     27   // DISABLED-NOT: ThreadSanitizer
     28   // DISABLED: PASS
     29   pthread_mutex_unlock(&mu1);
     30   pthread_mutex_unlock(&mu2);
     31 
     32   pthread_mutex_destroy(&mu1);
     33   pthread_mutex_destroy(&mu2);
     34   fprintf(stderr, "PASS\n");
     35 }
     36