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