blob: 4aeec82b6850820cf8f0789b158ed271206c9626 [file] [log] [blame]
Stephen Hines6d186232014-11-26 17:56:19 -08001// RUN: %clang_tsan -O1 %s -lpthread -o %t && %deflake %run %t | FileCheck %s
Stephen Hines2d1fdb22014-05-28 23:58:16 -07002// Regression test for
3// https://code.google.com/p/thread-sanitizer/issues/detail?id=61
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.
Stephen Hines86277eb2015-03-23 12:06:32 -07007#include "test.h"
Stephen Hines2d1fdb22014-05-28 23:58:16 -07008
9int glob = 0;
10
11void *worker(void *unused) {
Stephen Hines86277eb2015-03-23 12:06:32 -070012 barrier_wait(&barrier);
Stephen Hines2d1fdb22014-05-28 23:58:16 -070013 glob++;
14 return NULL;
15}
16
17void atfork() {
18 fprintf(stderr, "ATFORK\n");
19 glob++;
20}
21
22int main() {
Stephen Hines86277eb2015-03-23 12:06:32 -070023 barrier_init(&barrier, 2);
Stephen Hines2d1fdb22014-05-28 23:58:16 -070024 pthread_atfork(atfork, NULL, NULL);
25 pthread_t t;
26 pthread_create(&t, NULL, worker, NULL);
27 glob++;
Stephen Hines86277eb2015-03-23 12:06:32 -070028 barrier_wait(&barrier);
Stephen Hines2d1fdb22014-05-28 23:58:16 -070029 pthread_join(t, NULL);
30 // CHECK: ThreadSanitizer: data race
31 // CHECK-NOT: ATFORK
32 return 0;
33}