blob: 22bed086f7d086b6cb89c854221528efaae73dc1 [file] [log] [blame]
Pirama Arumuga Nainar799172d2016-03-03 15:50:30 -08001// RUN: %clangxx_tsan -O1 %s -o %t && %env_tsan_opts=atexit_sleep_ms=50 %run %t 2>&1 | FileCheck %s
2// UNSUPPORTED: darwin
Stephen Hines86277eb2015-03-23 12:06:32 -07003#include "test.h"
Stephen Hines2d1fdb22014-05-28 23:58:16 -07004#include <errno.h>
Stephen Hines2d1fdb22014-05-28 23:58:16 -07005#include <sys/types.h>
6#include <sys/wait.h>
7
8int counter;
9
10static void *incrementer(void *p) {
11 for (;;)
12 __sync_fetch_and_add(&counter, 1);
13 return 0;
14}
15
16static void *watchdog(void *p) {
Stephen Hines86277eb2015-03-23 12:06:32 -070017 sleep(100); // is not intended to exit
Stephen Hines2d1fdb22014-05-28 23:58:16 -070018 fprintf(stderr, "timed out after 100 seconds\n");
19 exit(1);
20 return 0;
21}
22
23int main() {
Stephen Hines86277eb2015-03-23 12:06:32 -070024 barrier_init(&barrier, 2);
Stephen Hines2d1fdb22014-05-28 23:58:16 -070025 pthread_t th1, th2;
26 pthread_create(&th1, 0, incrementer, 0);
27 pthread_create(&th2, 0, watchdog, 0);
28 for (int i = 0; i < 10; i++) {
29 switch (fork()) {
30 default: // parent
31 while (wait(0) < 0) {}
32 fprintf(stderr, ".");
33 break;
34 case 0: // child
35 __sync_fetch_and_add(&counter, 1);
36 exit(0);
37 break;
38 case -1: // error
39 fprintf(stderr, "failed to fork (%d)\n", errno);
40 exit(1);
41 }
42 }
43 fprintf(stderr, "OK\n");
44}
45
46// CHECK: OK
47