You've already forked linux-packaging-mono
							
							
		
			
	
	
		
			106 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
		
		
			
		
	
	
			106 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
|   | //===-- 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); | ||
|  | } |