12d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clangxx_tsan %s -o %t
22d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %run %t 2>&1 | FileCheck %s
32d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
4799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar// bench.h needs pthread barriers which are not available on OS X
5799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar// UNSUPPORTED: darwin
6799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
72d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include "bench.h"
82d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
92d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinespthread_mutex_t mtx;
102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinespthread_cond_t cv;
112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesint x;
122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid thread(int tid) {
142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  for (int i = 0; i < bench_niter; i++) {
152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    pthread_mutex_lock(&mtx);
162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    while (x != i * 2 + tid)
172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines      pthread_cond_wait(&cv, &mtx);
182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    x++;
192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    pthread_cond_signal(&cv);
202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    pthread_mutex_unlock(&mtx);
212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  }
222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid bench() {
252d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  pthread_mutex_init(&mtx, 0);
262d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  pthread_cond_init(&cv, 0);
272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  start_thread_group(2, thread);
282d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
292d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// CHECK: DONE
312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
32