1799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar// RUN: %clangxx_tsan -O1 %s -o %t && %env_tsan_opts=atexit_sleep_ms=50 %run %t 2>&1 | FileCheck %s
286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#include "test.h"
32d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <errno.h>
42d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <sys/types.h>
52d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <sys/wait.h>
62d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
72d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesint counter;
82d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
92d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesstatic void *incrementer(void *p) {
102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  for (;;)
112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    __sync_fetch_and_add(&counter, 1);
122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  return 0;
132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesint main() {
1686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  barrier_init(&barrier, 2);
17c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  pthread_t th1;
182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  pthread_create(&th1, 0, incrementer, 0);
192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  for (int i = 0; i < 10; i++) {
202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    switch (fork()) {
212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    default:  // parent
222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines      while (wait(0) < 0) {}
232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines      fprintf(stderr, ".");
242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines      break;
252d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    case 0:  // child
262d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines      __sync_fetch_and_add(&counter, 1);
272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines      exit(0);
282d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines      break;
292d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    case -1:  // error
302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines      fprintf(stderr, "failed to fork (%d)\n", errno);
312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines      exit(1);
322d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    }
332d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  }
342d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  fprintf(stderr, "OK\n");
352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
362d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
372d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// CHECK: OK
382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
39