diff options
author | Dmitry Vyukov <dvyukov@google.com> | 2014-03-26 14:13:49 +0000 |
---|---|---|
committer | Dmitry Vyukov <dvyukov@google.com> | 2014-03-26 14:13:49 +0000 |
commit | 3f6d90a17f67117767ba553105b9af06c2199929 (patch) | |
tree | b3ea58b4b4b861183856ed42cd0d4ef5c4c25751 /test | |
parent | 60cd766058a1b57e5023af89d3d69a7af2691674 (diff) |
tsan: add pthread_barrier_t test
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@204810 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test')
-rw-r--r-- | test/tsan/barrier.cc | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/test/tsan/barrier.cc b/test/tsan/barrier.cc new file mode 100644 index 000000000..f912e154f --- /dev/null +++ b/test/tsan/barrier.cc @@ -0,0 +1,37 @@ +// RUN: %clang_tsan -O1 %s -o %t && %t 2>&1 | FileCheck %s +// CHECK-NOT: ThreadSanitizer: data race +// CHECK: DONE + +#include <stdio.h> +#include <stdlib.h> +#include <pthread.h> +#include <unistd.h> + +const int kSize = 4; +volatile int kIter = 10; // prevent unwinding +int data[2][kSize]; +pthread_barrier_t barrier; + +void *thr(void *p) { + int idx = (int)(long)p; + for (int i = 0; i < kIter; i++) { + int *prev = data[i % 2]; + int *curr = data[(i + 1) % 2]; + int left = idx - 1 >= 0 ? prev[idx - 1] : 0; + int right = idx + 1 < kSize ? prev[idx + 1] : 0; + curr[idx] = (left + right) / 2; + pthread_barrier_wait(&barrier); + } + return 0; +} + +int main() { + pthread_barrier_init(&barrier, 0, kSize); + pthread_t th[kSize]; + for (int i = 0; i < kSize; i++) + pthread_create(&th[i], 0, thr, (void*)(long)i); + for (int i = 0; i < kSize; i++) + pthread_join(th[i], 0); + pthread_barrier_destroy(&barrier); + fprintf(stderr, "DONE\n"); +} |