diff options
Diffstat (limited to 'contrib/llvm-project/compiler-rt/lib/tsan/benchmarks/mini_bench_local.cpp')
| -rw-r--r-- | contrib/llvm-project/compiler-rt/lib/tsan/benchmarks/mini_bench_local.cpp | 49 | 
1 files changed, 49 insertions, 0 deletions
| diff --git a/contrib/llvm-project/compiler-rt/lib/tsan/benchmarks/mini_bench_local.cpp b/contrib/llvm-project/compiler-rt/lib/tsan/benchmarks/mini_bench_local.cpp new file mode 100644 index 000000000000..accdcb63878f --- /dev/null +++ b/contrib/llvm-project/compiler-rt/lib/tsan/benchmarks/mini_bench_local.cpp @@ -0,0 +1,49 @@ +// Mini-benchmark for tsan: non-shared memory writes. +#include <pthread.h> +#include <stdio.h> +#include <stdlib.h> +#include <assert.h> + +int len; +int *a; +const int kNumIter = 1000; + +__attribute__((noinline)) +void Run(int idx) { +  for (int i = 0, n = len; i < n; i++) +    a[i + idx * n] = i; +} + +void *Thread(void *arg) { +  long idx = (long)arg; +  printf("Thread %ld started\n", idx); +  for (int i = 0; i < kNumIter; i++) +    Run(idx); +  printf("Thread %ld done\n", idx); +  return 0; +} + +int main(int argc, char **argv) { +  int n_threads = 0; +  if (argc != 3) { +    n_threads = 4; +    len = 1000000; +  } else { +    n_threads = atoi(argv[1]); +    assert(n_threads > 0 && n_threads <= 32); +    len = atoi(argv[2]); +  } +  printf("%s: n_threads=%d len=%d iter=%d\n", +         __FILE__, n_threads, len, kNumIter); +  a = new int[n_threads * len]; +  pthread_t *t = new pthread_t[n_threads]; +  for (int i = 0; i < n_threads; i++) { +    pthread_create(&t[i], 0, Thread, (void*)i); +  } +  for (int i = 0; i < n_threads; i++) { +    pthread_join(t[i], 0); +  } +  delete [] t; +  delete [] a; +  return 0; +} | 
