54 lines · cpp
1// RUN: %clangxx_tsan -O1 %s -o %t2// RUN: %run %t 2>&1 | FileCheck %s3// RUN: %run %t arg 2>&1 | FileCheck %s4// RUN: %run %t arg arg 2>&1 | FileCheck %s5#include "test.h"6 7// Test for destruction of pthread_cond_t.8// POSIX states that it is safe to destroy a condition variable upon which no9// threads are currently blocked. That is, it is not necessary to wait untill10// other threads return from pthread_cond_wait, they just need to be unblocked.11 12pthread_mutex_t m;13pthread_cond_t c;14bool done1, done2;15 16void *thr(void *p) {17 pthread_mutex_lock(&m);18 done1 = true;19 pthread_cond_signal(&c);20 while (!done2)21 pthread_cond_wait(&c, &m);22 pthread_mutex_unlock(&m);23 return 0;24}25 26int main(int argc, char **argv) {27 pthread_t th;28 pthread_mutex_init(&m, 0);29 pthread_cond_init(&c, 0);30 pthread_create(&th, 0, thr, 0);31 pthread_mutex_lock(&m);32 while (!done1)33 pthread_cond_wait(&c, &m);34 done2 = true;35 // Any of these sequences is legal.36 if (argc == 1) {37 pthread_cond_signal(&c);38 pthread_mutex_unlock(&m);39 pthread_cond_destroy(&c);40 } else if (argc == 2) {41 pthread_mutex_unlock(&m);42 pthread_cond_signal(&c);43 pthread_cond_destroy(&c);44 } else {45 pthread_cond_signal(&c);46 pthread_cond_destroy(&c);47 pthread_mutex_unlock(&m);48 }49 pthread_join(th, 0);50 fprintf(stderr, "DONE\n");51}52 53// CHECK-NOT: ThreadSanitizer: data race54