Files
clang-p2996/compiler-rt/test/tsan/fork_deadlock.cc
Dmitry Vyukov 3ab6b2347e tsan: remove sleeps from tests
Even sleep(1) lead to episodical flakes on some machines.
Use an invisible by tsan barrier to enforce required execution order instead.
This makes the tests deterministic and faster.

llvm-svn: 226659
2015-01-21 13:50:02 +00:00

47 lines
985 B
C++

// RUN: %clangxx_tsan -O1 %s -o %t && TSAN_OPTIONS="atexit_sleep_ms=50" %run %t 2>&1 | FileCheck %s
#include "test.h"
#include <errno.h>
#include <sys/types.h>
#include <sys/wait.h>
int counter;
static void *incrementer(void *p) {
for (;;)
__sync_fetch_and_add(&counter, 1);
return 0;
}
static void *watchdog(void *p) {
sleep(100); // is not intended to exit
fprintf(stderr, "timed out after 100 seconds\n");
exit(1);
return 0;
}
int main() {
barrier_init(&barrier, 2);
pthread_t th1, th2;
pthread_create(&th1, 0, incrementer, 0);
pthread_create(&th2, 0, watchdog, 0);
for (int i = 0; i < 10; i++) {
switch (fork()) {
default: // parent
while (wait(0) < 0) {}
fprintf(stderr, ".");
break;
case 0: // child
__sync_fetch_and_add(&counter, 1);
exit(0);
break;
case -1: // error
fprintf(stderr, "failed to fork (%d)\n", errno);
exit(1);
}
}
fprintf(stderr, "OK\n");
}
// CHECK: OK