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