brintos

brintos / llvm-project-archived public Read only

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