brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.3 KiB · 03070bf Raw
52 lines · c
1// RUN: %clang_tsan -O1 %s -o %t && %run %t 2>&1 | FileCheck %s2// CHECK-NOT: WARNING3// CHECK: OK4// This test is failing on powerpc64 (VMA=44). After calling pthread_cancel,5// the Thread-specific data destructors are not called, so the destructor 6// "thread_finalize" (defined in tsan_interceptors.cpp) can not set the status7// of the thread to "ThreadStatusFinished" failing a check in "SetJoined" 8// (defined in sanitizer_thread_registry.cpp). It might seem a bug on glibc,9// however the same version GLIBC-2.17 will not make fail the test on 10// powerpc64 BE (VMA=46)11// UNSUPPORTED: target=powerpc64-unknown-linux-gnu{{.*}}12 13#include "test.h"14 15pthread_mutex_t m;16pthread_cond_t c;17int x;18 19static void my_cleanup(void *arg) {20  printf("my_cleanup\n");21  pthread_mutex_unlock((pthread_mutex_t*)arg);22}23 24void *thr1(void *p) {25  pthread_mutex_lock(&m);26  pthread_cleanup_push(my_cleanup, &m);27  barrier_wait(&barrier);28  while (x == 0)29    pthread_cond_wait(&c, &m);30  pthread_cleanup_pop(1);31  return 0;32}33 34int main() {35  barrier_init(&barrier, 2);36 37  pthread_t th;38 39  pthread_mutex_init(&m, 0);40  pthread_cond_init(&c, 0);41 42  pthread_create(&th, 0, thr1, 0);43  barrier_wait(&barrier);44  sleep(1);  // let it block on cond var45  pthread_cancel(th);46 47  pthread_join(th, 0);48  pthread_mutex_lock(&m);49  pthread_mutex_unlock(&m);50  fprintf(stderr, "OK\n");51}52