1603c4be006d8c53905d736bf1f19a49f5ce98276Alexey Samsonov//===-- tsan_clock_test.cc ------------------------------------------------===// 2da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany// 3da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany// The LLVM Compiler Infrastructure 4da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany// 5da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany// This file is distributed under the University of Illinois Open Source 6da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany// License. See LICENSE.TXT for details. 7da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany// 8da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany//===----------------------------------------------------------------------===// 9da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany// 10da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany// This file is a part of ThreadSanitizer (TSan), a race detector. 11da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany// 12da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany//===----------------------------------------------------------------------===// 13da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany#include "tsan_clock.h" 14da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany#include "tsan_rtl.h" 15da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany#include "gtest/gtest.h" 16da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 17da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryanynamespace __tsan { 18da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 19da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya SerebryanyTEST(Clock, VectorBasic) { 20da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany ScopedInRtl in_rtl; 21da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany ThreadClock clk; 22da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany CHECK_EQ(clk.size(), 0); 23da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany clk.tick(0); 24da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany CHECK_EQ(clk.size(), 1); 25da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany CHECK_EQ(clk.get(0), 1); 26da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany clk.tick(3); 27da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany CHECK_EQ(clk.size(), 4); 28da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany CHECK_EQ(clk.get(0), 1); 29da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany CHECK_EQ(clk.get(1), 0); 30da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany CHECK_EQ(clk.get(2), 0); 31da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany CHECK_EQ(clk.get(3), 1); 32da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany clk.tick(3); 33da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany CHECK_EQ(clk.get(3), 2); 34da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany} 35da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 36da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya SerebryanyTEST(Clock, ChunkedBasic) { 37da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany ScopedInRtl in_rtl; 38da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany ThreadClock vector; 39da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany SyncClock chunked; 40da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany CHECK_EQ(vector.size(), 0); 41da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany CHECK_EQ(chunked.size(), 0); 42da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany vector.acquire(&chunked); 43da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany CHECK_EQ(vector.size(), 0); 44da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany CHECK_EQ(chunked.size(), 0); 45da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany vector.release(&chunked); 46da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany CHECK_EQ(vector.size(), 0); 47da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany CHECK_EQ(chunked.size(), 0); 48da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany vector.acq_rel(&chunked); 49da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany CHECK_EQ(vector.size(), 0); 50da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany CHECK_EQ(chunked.size(), 0); 51da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany} 52da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 53da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya SerebryanyTEST(Clock, AcquireRelease) { 54da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany ScopedInRtl in_rtl; 55da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany ThreadClock vector1; 56da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany vector1.tick(100); 57da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany SyncClock chunked; 58da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany vector1.release(&chunked); 59da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany CHECK_EQ(chunked.size(), 101); 60da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany ThreadClock vector2; 61da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany vector2.acquire(&chunked); 62da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany CHECK_EQ(vector2.size(), 101); 63da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany CHECK_EQ(vector2.get(0), 0); 64da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany CHECK_EQ(vector2.get(1), 0); 65da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany CHECK_EQ(vector2.get(99), 0); 66da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany CHECK_EQ(vector2.get(100), 1); 67da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany} 68da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 69da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya SerebryanyTEST(Clock, ManyThreads) { 70da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany ScopedInRtl in_rtl; 71da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany SyncClock chunked; 72da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany for (int i = 0; i < 100; i++) { 73da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany ThreadClock vector; 74da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany vector.tick(i); 75da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany vector.release(&chunked); 76da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany CHECK_EQ(chunked.size(), i + 1); 77da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany vector.acquire(&chunked); 78da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany CHECK_EQ(vector.size(), i + 1); 79da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany } 80da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany ThreadClock vector; 81da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany vector.acquire(&chunked); 82da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany CHECK_EQ(vector.size(), 100); 83da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany for (int i = 0; i < 100; i++) 84da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany CHECK_EQ(vector.get(i), 1); 85da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany} 86da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 87da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya SerebryanyTEST(Clock, DifferentSizes) { 88da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany ScopedInRtl in_rtl; 89da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany { 90da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany ThreadClock vector1; 91da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany vector1.tick(10); 92da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany ThreadClock vector2; 93da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany vector2.tick(20); 94da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany { 95da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany SyncClock chunked; 96da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany vector1.release(&chunked); 97da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany CHECK_EQ(chunked.size(), 11); 98da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany vector2.release(&chunked); 99da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany CHECK_EQ(chunked.size(), 21); 100da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany } 101da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany { 102da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany SyncClock chunked; 103da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany vector2.release(&chunked); 104da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany CHECK_EQ(chunked.size(), 21); 105da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany vector1.release(&chunked); 106da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany CHECK_EQ(chunked.size(), 21); 107da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany } 108da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany { 109da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany SyncClock chunked; 110da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany vector1.release(&chunked); 111da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany vector2.acquire(&chunked); 112da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany CHECK_EQ(vector2.size(), 21); 113da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany } 114da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany { 115da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany SyncClock chunked; 116da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany vector2.release(&chunked); 117da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany vector1.acquire(&chunked); 118da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany CHECK_EQ(vector1.size(), 21); 119da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany } 120da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany } 121da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany} 122da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 123da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany} // namespace __tsan 124