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