brintos

brintos / llvm-project-archived public Read only

0
0
Text · 880 B · 3810a10 Raw
54 lines · cpp
1// RUN: %clangxx_tsan -O1 %s -o %t && %deflake %run %t | FileCheck %s2#include "test.h"3#include <semaphore.h>4 5struct A {6  A() {7    sem_init(&sem_, 0, 0);8  }9  virtual void F() {10  }11  void Done() {12    sem_post(&sem_);13  }14  virtual ~A() {15    sem_wait(&sem_);16    sem_destroy(&sem_);17  }18  sem_t sem_;19};20 21struct B : A {22  virtual void F() {23  }24  virtual ~B() { }25};26 27static A *obj = new B;28static void (A::*fn)() = &A::F;29 30void *Thread1(void *x) {31  (obj->*fn)();32  barrier_wait(&barrier);33  obj->Done();34  return NULL;35}36 37void *Thread2(void *x) {38  barrier_wait(&barrier);39  delete obj;40  return NULL;41}42 43int main() {44  barrier_init(&barrier, 2);45  pthread_t t[2];46  pthread_create(&t[0], NULL, Thread1, NULL);47  pthread_create(&t[1], NULL, Thread2, NULL);48  pthread_join(t[0], NULL);49  pthread_join(t[1], NULL);50}51 52// CHECK: WARNING: ThreadSanitizer: data race on vptr53 54