//===-- tsan_bench.cpp ----------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // 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 const int kSize = 128; const int kRepeat = 2*1024*1024; void noinstr(void *p) {} template 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(); } TEST(DISABLED_BENCH, Mop1Read) { Benchmark(); } TEST(DISABLED_BENCH, Mop1Write) { Benchmark(); } TEST(DISABLED_BENCH, Mop2) { Benchmark(); } TEST(DISABLED_BENCH, Mop2Read) { Benchmark(); } TEST(DISABLED_BENCH, Mop2Write) { Benchmark(); } TEST(DISABLED_BENCH, Mop4) { Benchmark(); } TEST(DISABLED_BENCH, Mop4Read) { Benchmark(); } TEST(DISABLED_BENCH, Mop4Write) { Benchmark(); } TEST(DISABLED_BENCH, Mop8) { Benchmark(); } TEST(DISABLED_BENCH, Mop8Read) { Benchmark(); } TEST(DISABLED_BENCH, Mop8Write) { Benchmark(); } 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); }