| //===-- 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); |
| } |