16a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines// RUN: %clangxx_tsan -O1 %s -o %t && %deflake %run %t | FileCheck %s
211f5309ec1bf13430c8a3a16f177d9e8e1190e38Dmitry Vyukov#include <pthread.h>
311f5309ec1bf13430c8a3a16f177d9e8e1190e38Dmitry Vyukov#include <stdlib.h>
411f5309ec1bf13430c8a3a16f177d9e8e1190e38Dmitry Vyukov#include <stdio.h>
511f5309ec1bf13430c8a3a16f177d9e8e1190e38Dmitry Vyukov#include <unistd.h>
611f5309ec1bf13430c8a3a16f177d9e8e1190e38Dmitry Vyukov#include <errno.h>
711f5309ec1bf13430c8a3a16f177d9e8e1190e38Dmitry Vyukov
811f5309ec1bf13430c8a3a16f177d9e8e1190e38Dmitry Vyukovpthread_mutex_t m;
911f5309ec1bf13430c8a3a16f177d9e8e1190e38Dmitry Vyukovint x;
1011f5309ec1bf13430c8a3a16f177d9e8e1190e38Dmitry Vyukov
1111f5309ec1bf13430c8a3a16f177d9e8e1190e38Dmitry Vyukovvoid *thr(void *p) {
1211f5309ec1bf13430c8a3a16f177d9e8e1190e38Dmitry Vyukov  pthread_mutex_lock(&m);
1311f5309ec1bf13430c8a3a16f177d9e8e1190e38Dmitry Vyukov  x = 42;
1411f5309ec1bf13430c8a3a16f177d9e8e1190e38Dmitry Vyukov  return 0;
1511f5309ec1bf13430c8a3a16f177d9e8e1190e38Dmitry Vyukov}
1611f5309ec1bf13430c8a3a16f177d9e8e1190e38Dmitry Vyukov
1711f5309ec1bf13430c8a3a16f177d9e8e1190e38Dmitry Vyukovint main() {
1811f5309ec1bf13430c8a3a16f177d9e8e1190e38Dmitry Vyukov  pthread_mutexattr_t a;
1911f5309ec1bf13430c8a3a16f177d9e8e1190e38Dmitry Vyukov  pthread_mutexattr_init(&a);
2011f5309ec1bf13430c8a3a16f177d9e8e1190e38Dmitry Vyukov  pthread_mutexattr_setrobust(&a, PTHREAD_MUTEX_ROBUST);
2111f5309ec1bf13430c8a3a16f177d9e8e1190e38Dmitry Vyukov  pthread_mutex_init(&m, &a);
2211f5309ec1bf13430c8a3a16f177d9e8e1190e38Dmitry Vyukov  pthread_t th;
2311f5309ec1bf13430c8a3a16f177d9e8e1190e38Dmitry Vyukov  pthread_create(&th, 0, thr, 0);
2411f5309ec1bf13430c8a3a16f177d9e8e1190e38Dmitry Vyukov  sleep(1);
2511f5309ec1bf13430c8a3a16f177d9e8e1190e38Dmitry Vyukov  if (pthread_mutex_trylock(&m) != EOWNERDEAD) {
2611f5309ec1bf13430c8a3a16f177d9e8e1190e38Dmitry Vyukov    fprintf(stderr, "not EOWNERDEAD\n");
2711f5309ec1bf13430c8a3a16f177d9e8e1190e38Dmitry Vyukov    exit(1);
2811f5309ec1bf13430c8a3a16f177d9e8e1190e38Dmitry Vyukov  }
2911f5309ec1bf13430c8a3a16f177d9e8e1190e38Dmitry Vyukov  x = 43;
3011f5309ec1bf13430c8a3a16f177d9e8e1190e38Dmitry Vyukov  pthread_join(th, 0);
3111f5309ec1bf13430c8a3a16f177d9e8e1190e38Dmitry Vyukov  fprintf(stderr, "DONE\n");
3211f5309ec1bf13430c8a3a16f177d9e8e1190e38Dmitry Vyukov}
3311f5309ec1bf13430c8a3a16f177d9e8e1190e38Dmitry Vyukov
3411f5309ec1bf13430c8a3a16f177d9e8e1190e38Dmitry Vyukov// This is a false positive, tsan must not bark at the data race.
3511f5309ec1bf13430c8a3a16f177d9e8e1190e38Dmitry Vyukov// But currently it does.
3611f5309ec1bf13430c8a3a16f177d9e8e1190e38Dmitry Vyukov// CHECK-NOT: WARNING: ThreadSanitizer WARNING: double lock of mutex
3711f5309ec1bf13430c8a3a16f177d9e8e1190e38Dmitry Vyukov// CHECK: WARNING: ThreadSanitizer: data race
3811f5309ec1bf13430c8a3a16f177d9e8e1190e38Dmitry Vyukov// CHECK-NOT: EOWNERDEAD
3911f5309ec1bf13430c8a3a16f177d9e8e1190e38Dmitry Vyukov// CHECK: DONE
4011f5309ec1bf13430c8a3a16f177d9e8e1190e38Dmitry Vyukov// CHECK-NOT: WARNING: ThreadSanitizer
4111f5309ec1bf13430c8a3a16f177d9e8e1190e38Dmitry Vyukov
42