1// RUN: %clangxx_tsan -O1 %s -o %t && TSAN_OPTIONS="atexit_sleep_ms=50" %run %t 2>&1 | FileCheck %s
2#include <stdlib.h>
3#include <stdio.h>
4#include <errno.h>
5#include <pthread.h>
6#include <unistd.h>
7#include <sys/types.h>
8#include <sys/wait.h>
9
10int counter;
11
12static void *incrementer(void *p) {
13  for (;;)
14    __sync_fetch_and_add(&counter, 1);
15  return 0;
16}
17
18static void *watchdog(void *p) {
19  sleep(100);
20  fprintf(stderr, "timed out after 100 seconds\n");
21  exit(1);
22  return 0;
23}
24
25int main() {
26  pthread_t th1, th2;
27  pthread_create(&th1, 0, incrementer, 0);
28  pthread_create(&th2, 0, watchdog, 0);
29  for (int i = 0; i < 10; i++) {
30    switch (fork()) {
31    default:  // parent
32      while (wait(0) < 0) {}
33      fprintf(stderr, ".");
34      break;
35    case 0:  // child
36      __sync_fetch_and_add(&counter, 1);
37      exit(0);
38      break;
39    case -1:  // error
40      fprintf(stderr, "failed to fork (%d)\n", errno);
41      exit(1);
42    }
43  }
44  fprintf(stderr, "OK\n");
45}
46
47// CHECK: OK
48
49