//===-- tsan_bench.cc -----------------------------------------------------===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file is a part of ThreadSanitizer (TSan), a race detector.
//
//===----------------------------------------------------------------------===//
#include "tsan_test_util.h"
#include "tsan_interface.h"
#include "tsan_defs.h"
#include "gtest/gtest.h"
#include <stdint.h>

const int kSize = 128;
const int kRepeat = 2*1024*1024;

void noinstr(void *p) {}

template<typename T, void(*__tsan_mop)(void *p)>
static void Benchmark() {
  volatile T data[kSize];
  for (int i = 0; i < kRepeat; i++) {
    for (int j = 0; j < kSize; j++) {
      __tsan_mop((void*)&data[j]);
      data[j]++;
    }
  }
}

TEST(DISABLED_BENCH, Mop1) {
  Benchmark<uint8_t, noinstr>();
}

TEST(DISABLED_BENCH, Mop1Read) {
  Benchmark<uint8_t, __tsan_read1>();
}

TEST(DISABLED_BENCH, Mop1Write) {
  Benchmark<uint8_t, __tsan_write1>();
}

TEST(DISABLED_BENCH, Mop2) {
  Benchmark<uint16_t, noinstr>();
}

TEST(DISABLED_BENCH, Mop2Read) {
  Benchmark<uint16_t, __tsan_read2>();
}

TEST(DISABLED_BENCH, Mop2Write) {
  Benchmark<uint16_t, __tsan_write2>();
}

TEST(DISABLED_BENCH, Mop4) {
  Benchmark<uint32_t, noinstr>();
}

TEST(DISABLED_BENCH, Mop4Read) {
  Benchmark<uint32_t, __tsan_read4>();
}

TEST(DISABLED_BENCH, Mop4Write) {
  Benchmark<uint32_t, __tsan_write4>();
}

TEST(DISABLED_BENCH, Mop8) {
  Benchmark<uint8_t, noinstr>();
}

TEST(DISABLED_BENCH, Mop8Read) {
  Benchmark<uint64_t, __tsan_read8>();
}

TEST(DISABLED_BENCH, Mop8Write) {
  Benchmark<uint64_t, __tsan_write8>();
}

TEST(DISABLED_BENCH, FuncCall) {
  for (int i = 0; i < kRepeat; i++) {
    for (int j = 0; j < kSize; j++)
      __tsan_func_entry((void*)(uintptr_t)j);
    for (int j = 0; j < kSize; j++)
      __tsan_func_exit();
  }
}

TEST(DISABLED_BENCH, MutexLocal) {
  Mutex m;
  ScopedThread().Create(m);
  for (int i = 0; i < 50; i++) {
    ScopedThread t;
    t.Lock(m);
    t.Unlock(m);
  }
  for (int i = 0; i < 16*1024*1024; i++) {
    m.Lock();
    m.Unlock();
  }
  ScopedThread().Destroy(m);
}
