]>
Commit | Line | Data |
---|---|---|
92a42be0 SL |
1 | // RUN: %clang_tsan -O1 %s -lpthread -o %t && %deflake %run %t | FileCheck %s |
2 | // Regression test for | |
3157f602 | 3 | // https://github.com/google/sanitizers/issues/468 |
92a42be0 SL |
4 | // When the data race was reported, pthread_atfork() handler used to be |
5 | // executed which caused another race report in the same thread, which resulted | |
6 | // in a deadlock. | |
7 | #include "test.h" | |
8 | ||
9 | int glob = 0; | |
10 | ||
11 | void *worker(void *unused) { | |
12 | barrier_wait(&barrier); | |
13 | glob++; | |
14 | return NULL; | |
15 | } | |
16 | ||
17 | void atfork() { | |
18 | fprintf(stderr, "ATFORK\n"); | |
19 | glob++; | |
20 | } | |
21 | ||
22 | int main() { | |
23 | barrier_init(&barrier, 2); | |
24 | pthread_atfork(atfork, NULL, NULL); | |
25 | pthread_t t; | |
26 | pthread_create(&t, NULL, worker, NULL); | |
27 | glob++; | |
28 | barrier_wait(&barrier); | |
29 | pthread_join(t, NULL); | |
30 | // CHECK: ThreadSanitizer: data race | |
31 | // CHECK-NOT: ATFORK | |
32 | return 0; | |
33 | } |