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