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