summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2014-03-26 14:13:49 +0000
committerDmitry Vyukov <dvyukov@google.com>2014-03-26 14:13:49 +0000
commit3f6d90a17f67117767ba553105b9af06c2199929 (patch)
treeb3ea58b4b4b861183856ed42cd0d4ef5c4c25751 /test
parent60cd766058a1b57e5023af89d3d69a7af2691674 (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.cc37
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");
+}