12d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clangxx_tsan %s -o %t
22d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %run %t 2>&1 | FileCheck %s
32d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
42d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include "bench.h"
52d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
62d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinespthread_rwlock_t mtx;
72d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
82d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid thread(int tid) {
92d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  for (int i = 0; i < bench_niter; i++) {
102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    pthread_rwlock_rdlock(&mtx);
112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    pthread_rwlock_unlock(&mtx);
122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  }
132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid bench() {
162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  pthread_rwlock_init(&mtx, 0);
172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  pthread_rwlock_wrlock(&mtx);
182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  pthread_rwlock_unlock(&mtx);
192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  pthread_rwlock_rdlock(&mtx);
202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  pthread_rwlock_unlock(&mtx);
212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  start_thread_group(bench_nthread, thread);
222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// CHECK: DONE
252d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
26