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