]>
Commit | Line | Data |
---|---|---|
1 | // RUN: %clangxx_tsan -O1 %s -o %t && %deflake %run %t | FileCheck %s | |
2 | #include "test.h" | |
3 | #include <semaphore.h> | |
4 | ||
5 | struct 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 | ||
21 | struct B : A { | |
22 | virtual void F() { | |
23 | } | |
24 | virtual ~B() { } | |
25 | }; | |
26 | ||
27 | static A *obj = new B; | |
28 | ||
29 | void *Thread1(void *x) { | |
30 | obj->F(); | |
31 | barrier_wait(&barrier); | |
32 | obj->Done(); | |
33 | return NULL; | |
34 | } | |
35 | ||
36 | void *Thread2(void *x) { | |
37 | barrier_wait(&barrier); | |
38 | delete obj; | |
39 | return NULL; | |
40 | } | |
41 | ||
42 | int main() { | |
43 | barrier_init(&barrier, 2); | |
44 | pthread_t t[2]; | |
45 | pthread_create(&t[0], NULL, Thread1, NULL); | |
46 | pthread_create(&t[1], NULL, Thread2, NULL); | |
47 | pthread_join(t[0], NULL); | |
48 | pthread_join(t[1], NULL); | |
49 | } | |
50 | ||
51 | // CHECK: WARNING: ThreadSanitizer: data race on vptr |