16d1862363c88c183b0ed7740fca876342cf0474bStephen Hines// Test that the deadlock detector can find a deadlock that actually happened.
26d1862363c88c183b0ed7740fca876342cf0474bStephen Hines// Currently we will fail to report such a deadlock because we check for
36d1862363c88c183b0ed7740fca876342cf0474bStephen Hines// cycles in lock-order graph after pthread_mutex_lock.
46d1862363c88c183b0ed7740fca876342cf0474bStephen Hines
56d1862363c88c183b0ed7740fca876342cf0474bStephen Hines// RUN: %clangxx_tsan %s -o %t
66d1862363c88c183b0ed7740fca876342cf0474bStephen Hines// RUN: not %run %t 2>&1 | FileCheck %s
76d1862363c88c183b0ed7740fca876342cf0474bStephen Hines// XFAIL: *
86d1862363c88c183b0ed7740fca876342cf0474bStephen Hines#include <pthread.h>
96d1862363c88c183b0ed7740fca876342cf0474bStephen Hines#include <stdio.h>
106d1862363c88c183b0ed7740fca876342cf0474bStephen Hines#include <unistd.h>
116d1862363c88c183b0ed7740fca876342cf0474bStephen Hines
126d1862363c88c183b0ed7740fca876342cf0474bStephen Hinespthread_mutex_t mu1, mu2;
136d1862363c88c183b0ed7740fca876342cf0474bStephen Hinespthread_barrier_t barrier;
146d1862363c88c183b0ed7740fca876342cf0474bStephen Hines
156d1862363c88c183b0ed7740fca876342cf0474bStephen Hinesvoid *Thread(void *p) {
166d1862363c88c183b0ed7740fca876342cf0474bStephen Hines  // mu2 => mu1
176d1862363c88c183b0ed7740fca876342cf0474bStephen Hines  pthread_mutex_lock(&mu2);
186d1862363c88c183b0ed7740fca876342cf0474bStephen Hines  pthread_barrier_wait(&barrier);
196d1862363c88c183b0ed7740fca876342cf0474bStephen Hines  pthread_mutex_lock(&mu1);
206d1862363c88c183b0ed7740fca876342cf0474bStephen Hines  // CHECK: ThreadSanitizer: lock-order-inversion (potential deadlock)
216d1862363c88c183b0ed7740fca876342cf0474bStephen Hines  pthread_mutex_unlock(&mu1);
226d1862363c88c183b0ed7740fca876342cf0474bStephen Hines  pthread_mutex_unlock(&mu2);
236d1862363c88c183b0ed7740fca876342cf0474bStephen Hines  return p;
246d1862363c88c183b0ed7740fca876342cf0474bStephen Hines}
256d1862363c88c183b0ed7740fca876342cf0474bStephen Hines
266d1862363c88c183b0ed7740fca876342cf0474bStephen Hinesint main() {
276d1862363c88c183b0ed7740fca876342cf0474bStephen Hines  pthread_mutex_init(&mu1, NULL);
286d1862363c88c183b0ed7740fca876342cf0474bStephen Hines  pthread_mutex_init(&mu2, NULL);
296d1862363c88c183b0ed7740fca876342cf0474bStephen Hines  pthread_barrier_init(&barrier, 0, 2);
306d1862363c88c183b0ed7740fca876342cf0474bStephen Hines
316d1862363c88c183b0ed7740fca876342cf0474bStephen Hines  fprintf(stderr, "This test is going to deadlock and die in 3 seconds\n");
326d1862363c88c183b0ed7740fca876342cf0474bStephen Hines  alarm(3);
336d1862363c88c183b0ed7740fca876342cf0474bStephen Hines
346d1862363c88c183b0ed7740fca876342cf0474bStephen Hines  pthread_t t;
356d1862363c88c183b0ed7740fca876342cf0474bStephen Hines  pthread_create(&t, 0, Thread, 0);
366d1862363c88c183b0ed7740fca876342cf0474bStephen Hines
376d1862363c88c183b0ed7740fca876342cf0474bStephen Hines  // mu1 => mu2
386d1862363c88c183b0ed7740fca876342cf0474bStephen Hines  pthread_mutex_lock(&mu1);
396d1862363c88c183b0ed7740fca876342cf0474bStephen Hines  pthread_barrier_wait(&barrier);
406d1862363c88c183b0ed7740fca876342cf0474bStephen Hines  pthread_mutex_lock(&mu2);
416d1862363c88c183b0ed7740fca876342cf0474bStephen Hines  pthread_mutex_unlock(&mu2);
426d1862363c88c183b0ed7740fca876342cf0474bStephen Hines  pthread_mutex_unlock(&mu1);
436d1862363c88c183b0ed7740fca876342cf0474bStephen Hines
446d1862363c88c183b0ed7740fca876342cf0474bStephen Hines  pthread_join(t, 0);
456d1862363c88c183b0ed7740fca876342cf0474bStephen Hines
466d1862363c88c183b0ed7740fca876342cf0474bStephen Hines  pthread_mutex_destroy(&mu1);
476d1862363c88c183b0ed7740fca876342cf0474bStephen Hines  pthread_mutex_destroy(&mu2);
486d1862363c88c183b0ed7740fca876342cf0474bStephen Hines  pthread_barrier_destroy(&barrier);
496d1862363c88c183b0ed7740fca876342cf0474bStephen Hines  fprintf(stderr, "FAILED\n");
506d1862363c88c183b0ed7740fca876342cf0474bStephen Hines}
51