1ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov//===-- tsan_mutexset_test.cc ---------------------------------------------===// 2ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov// 3ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov// The LLVM Compiler Infrastructure 4ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov// 5ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov// This file is distributed under the University of Illinois Open Source 6ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov// License. See LICENSE.TXT for details. 7ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov// 8ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov//===----------------------------------------------------------------------===// 9ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov// 10ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov// This file is a part of ThreadSanitizer (TSan), a race detector. 11ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov// 12ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov//===----------------------------------------------------------------------===// 13ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov#include "tsan_mutexset.h" 14ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov#include "gtest/gtest.h" 15ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov 16ad9da372f962495b3487685232d09390be841b1cDmitry Vyukovnamespace __tsan { 17ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov 18ad9da372f962495b3487685232d09390be841b1cDmitry Vyukovstatic void Expect(const MutexSet &mset, uptr i, u64 id, bool write, u64 epoch, 19ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov int count) { 20ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov MutexSet::Desc d = mset.Get(i); 21ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov EXPECT_EQ(id, d.id); 22ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov EXPECT_EQ(write, d.write); 23ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov EXPECT_EQ(epoch, d.epoch); 24ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov EXPECT_EQ(count, d.count); 25ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov} 26ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov 27ad9da372f962495b3487685232d09390be841b1cDmitry VyukovTEST(MutexSet, Basic) { 28ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov MutexSet mset; 29ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov EXPECT_EQ(mset.Size(), (uptr)0); 30ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov 31ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov mset.Add(1, true, 2); 32ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov EXPECT_EQ(mset.Size(), (uptr)1); 33ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov Expect(mset, 0, 1, true, 2, 1); 34ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov mset.Del(1, true); 35ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov EXPECT_EQ(mset.Size(), (uptr)0); 36ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov 37ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov mset.Add(3, true, 4); 38ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov mset.Add(5, false, 6); 39ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov EXPECT_EQ(mset.Size(), (uptr)2); 40ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov Expect(mset, 0, 3, true, 4, 1); 41ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov Expect(mset, 1, 5, false, 6, 1); 42ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov mset.Del(3, true); 43ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov EXPECT_EQ(mset.Size(), (uptr)1); 44ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov mset.Del(5, false); 45ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov EXPECT_EQ(mset.Size(), (uptr)0); 46ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov} 47ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov 48ad9da372f962495b3487685232d09390be841b1cDmitry VyukovTEST(MutexSet, DoubleAdd) { 49ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov MutexSet mset; 50ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov mset.Add(1, true, 2); 51ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov EXPECT_EQ(mset.Size(), (uptr)1); 52ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov Expect(mset, 0, 1, true, 2, 1); 53ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov 54ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov mset.Add(1, true, 2); 55ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov EXPECT_EQ(mset.Size(), (uptr)1); 56ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov Expect(mset, 0, 1, true, 2, 2); 57ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov 58ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov mset.Del(1, true); 59ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov EXPECT_EQ(mset.Size(), (uptr)1); 60ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov Expect(mset, 0, 1, true, 2, 1); 61ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov 62ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov mset.Del(1, true); 63ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov EXPECT_EQ(mset.Size(), (uptr)0); 64ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov} 65ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov 66ad9da372f962495b3487685232d09390be841b1cDmitry VyukovTEST(MutexSet, DoubleDel) { 67ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov MutexSet mset; 68ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov mset.Add(1, true, 2); 69ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov EXPECT_EQ(mset.Size(), (uptr)1); 70ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov mset.Del(1, true); 71ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov EXPECT_EQ(mset.Size(), (uptr)0); 72ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov mset.Del(1, true); 73ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov EXPECT_EQ(mset.Size(), (uptr)0); 74ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov} 75ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov 76ad9da372f962495b3487685232d09390be841b1cDmitry VyukovTEST(MutexSet, Remove) { 77ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov MutexSet mset; 78ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov mset.Add(1, true, 2); 79ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov mset.Add(1, true, 2); 80ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov mset.Add(3, true, 4); 81ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov mset.Add(3, true, 4); 82ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov EXPECT_EQ(mset.Size(), (uptr)2); 83ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov 84ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov mset.Remove(1); 85ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov EXPECT_EQ(mset.Size(), (uptr)1); 86ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov Expect(mset, 0, 3, true, 4, 2); 87ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov} 88ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov 89ad9da372f962495b3487685232d09390be841b1cDmitry VyukovTEST(MutexSet, Full) { 90ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov MutexSet mset; 91ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov for (uptr i = 0; i < MutexSet::kMaxSize; i++) { 92ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov mset.Add(i, true, i + 1); 93ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov } 94ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov EXPECT_EQ(mset.Size(), MutexSet::kMaxSize); 95ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov for (uptr i = 0; i < MutexSet::kMaxSize; i++) { 96ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov Expect(mset, i, i, true, i + 1, 1); 97ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov } 98ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov 99ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov for (uptr i = 0; i < MutexSet::kMaxSize; i++) { 100ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov mset.Add(i, true, i + 1); 101ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov } 102ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov EXPECT_EQ(mset.Size(), MutexSet::kMaxSize); 103ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov for (uptr i = 0; i < MutexSet::kMaxSize; i++) { 104ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov Expect(mset, i, i, true, i + 1, 2); 105ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov } 106ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov} 107ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov 108ad9da372f962495b3487685232d09390be841b1cDmitry VyukovTEST(MutexSet, Overflow) { 109ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov MutexSet mset; 110ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov for (uptr i = 0; i < MutexSet::kMaxSize; i++) { 111ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov mset.Add(i, true, i + 1); 112ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov mset.Add(i, true, i + 1); 113ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov } 114ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov mset.Add(100, true, 200); 115ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov EXPECT_EQ(mset.Size(), MutexSet::kMaxSize); 116ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov for (uptr i = 0; i < MutexSet::kMaxSize; i++) { 117ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov if (i == 0) 118cab13157ffa88ab123f2a653b9affdc8cb73bcd9Dmitry Vyukov Expect(mset, i, MutexSet::kMaxSize - 1, 119cab13157ffa88ab123f2a653b9affdc8cb73bcd9Dmitry Vyukov true, MutexSet::kMaxSize, 2); 120ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov else if (i == MutexSet::kMaxSize - 1) 121ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov Expect(mset, i, 100, true, 200, 1); 122ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov else 123ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov Expect(mset, i, i, true, i + 1, 2); 124ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov } 125ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov} 126ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov 127ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov} // namespace __tsan 128