12d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clang_tsan -O1 %s -o %t && %run %t 2>&1 | FileCheck %s 22d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// CHECK-NOT: ThreadSanitizer: data race 32d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// CHECK: DONE 42d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 52d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <stdio.h> 62d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <stdlib.h> 72d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <pthread.h> 82d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <unistd.h> 92d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesconst int kSize = 4; 112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvolatile int kIter = 10; // prevent unwinding 122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesint data[2][kSize]; 132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinespthread_barrier_t barrier; 142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid *thr(void *p) { 162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines int idx = (int)(long)p; 172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines for (int i = 0; i < kIter; i++) { 182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines int *prev = data[i % 2]; 192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines int *curr = data[(i + 1) % 2]; 202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines int left = idx - 1 >= 0 ? prev[idx - 1] : 0; 212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines int right = idx + 1 < kSize ? prev[idx + 1] : 0; 222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines curr[idx] = (left + right) / 2; 232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines pthread_barrier_wait(&barrier); 242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines } 252d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines return 0; 262d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 282d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesint main() { 292d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines pthread_barrier_init(&barrier, 0, kSize); 302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines pthread_t th[kSize]; 312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines for (int i = 0; i < kSize; i++) 322d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines pthread_create(&th[i], 0, thr, (void*)(long)i); 332d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines for (int i = 0; i < kSize; i++) 342d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines pthread_join(th[i], 0); 352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines pthread_barrier_destroy(&barrier); 362d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines fprintf(stderr, "DONE\n"); 372d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 38