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