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