1799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar// RUN: %clangxx_tsan -O1 %s -o %t 2799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar// RUN: %run %t 2>&1 | FileCheck %s 3799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar// RUN: %run %t arg 2>&1 | FileCheck %s 4799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar// RUN: %run %t arg arg 2>&1 | FileCheck %s 5799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#include "test.h" 6799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar 7799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar// Test for destruction of pthread_cond_t. 8799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar// POSIX states that it is safe to destroy a condition variable upon which no 9799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar// threads are currently blocked. That is, it is not necessary to wait untill 10799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar// other threads return from pthread_cond_wait, they just need to be unblocked. 11799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar 12799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainarpthread_mutex_t m; 13799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainarpthread_cond_t c; 14799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainarbool done1, done2; 15799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar 16799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainarvoid *thr(void *p) { 17799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar pthread_mutex_lock(&m); 18799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar done1 = true; 19799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar pthread_cond_signal(&c); 20799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar while (!done2) 21799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar pthread_cond_wait(&c, &m); 22799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar pthread_mutex_unlock(&m); 23799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar return 0; 24799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar} 25799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar 26799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainarint main(int argc, char **argv) { 27799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar pthread_t th; 28799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar pthread_mutex_init(&m, 0); 29799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar pthread_cond_init(&c, 0); 30799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar pthread_create(&th, 0, thr, 0); 31799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar pthread_mutex_lock(&m); 32799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar while (!done1) 33799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar pthread_cond_wait(&c, &m); 34799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar done2 = true; 35799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar // Any of these sequences is legal. 36799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar if (argc == 1) { 37799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar pthread_cond_signal(&c); 38799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar pthread_mutex_unlock(&m); 39799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar pthread_cond_destroy(&c); 40799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar } else if (argc == 2) { 41799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar pthread_mutex_unlock(&m); 42799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar pthread_cond_signal(&c); 43799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar pthread_cond_destroy(&c); 44799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar } else { 45799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar pthread_cond_signal(&c); 46799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar pthread_cond_destroy(&c); 47799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar pthread_mutex_unlock(&m); 48799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar } 49799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar pthread_join(th, 0); 50799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar fprintf(stderr, "DONE\n"); 51799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar} 52799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar 53799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar// CHECK-NOT: ThreadSanitizer: data race 54