1238901Sandrew// Mini-benchmark for tsan: shared memory reads.
2238901Sandrew#include <pthread.h>
3238901Sandrew#include <stdio.h>
4238901Sandrew#include <stdlib.h>
5238901Sandrew#include <assert.h>
6238901Sandrew
7238901Sandrewint len;
8238901Sandrewint *a;
9238901Sandrewconst int kNumIter = 1000;
10238901Sandrew
11238901Sandrew__attribute__((noinline))
12238901Sandrewvoid Run(int idx) {
13238901Sandrew  for (int i = 0, n = len; i < n; i++)
14238901Sandrew    if (a[i] != i) abort();
15238901Sandrew}
16238901Sandrew
17238901Sandrewvoid *Thread(void *arg) {
18238901Sandrew  long idx = (long)arg;
19238901Sandrew  printf("Thread %ld started\n", idx);
20238901Sandrew  for (int i = 0; i < kNumIter; i++)
21238901Sandrew    Run(idx);
22238901Sandrew  printf("Thread %ld done\n", idx);
23238901Sandrew  return 0;
24238901Sandrew}
25238901Sandrew
26238901Sandrewint main(int argc, char **argv) {
27238901Sandrew  int n_threads = 0;
28238901Sandrew  if (argc != 3) {
29238901Sandrew    n_threads = 4;
30238901Sandrew    len = 1000000;
31238901Sandrew  } else {
32238901Sandrew    n_threads = atoi(argv[1]);
33238901Sandrew    assert(n_threads > 0 && n_threads <= 32);
34238901Sandrew    len = atoi(argv[2]);
35238901Sandrew  }
36238901Sandrew  printf("%s: n_threads=%d len=%d iter=%d\n",
37238901Sandrew         __FILE__, n_threads, len, kNumIter);
38238901Sandrew  a = new int[len];
39238901Sandrew  for (int i = 0, n = len; i < n; i++)
40238901Sandrew    a[i] = i;
41238901Sandrew  pthread_t *t = new pthread_t[n_threads];
42238901Sandrew  for (int i = 0; i < n_threads; i++) {
43238901Sandrew    pthread_create(&t[i], 0, Thread, (void*)i);
44238901Sandrew  }
45238901Sandrew  for (int i = 0; i < n_threads; i++) {
46238901Sandrew    pthread_join(t[i], 0);
47238901Sandrew  }
48238901Sandrew  delete [] t;
49238901Sandrew  delete [] a;
50238901Sandrew  return 0;
51238901Sandrew}
52