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