sanitizer_list_test.cc revision 5a2327c20ab8ff8185faf51d7abc72c012a763f9
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//===-- sanitizer_list_test.cc --------------------------------------------===//
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//                     The LLVM Compiler Infrastructure
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This file is distributed under the University of Illinois Open Source
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// License. See LICENSE.TXT for details.
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//===----------------------------------------------------------------------===//
97d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)//
103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// This file is a part of ThreadSanitizer/AddressSanitizer runtime.
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//===----------------------------------------------------------------------===//
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "sanitizer_common/sanitizer_list.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "gtest/gtest.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace __sanitizer {
17ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct ListItem {
1990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ListItem *next;
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)typedef IntrusiveList<ListItem> List;
23b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Check that IntrusiveList can be made thread-local.
25f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)static THREADLOCAL List static_list;
261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
27a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)static void SetList(List *l, ListItem *x, ListItem *y = 0, ListItem *z = 0) {
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  l->clear();
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  l->push_back(x);
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (y) l->push_back(y);
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (z) l->push_back(z);
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static void CheckList(List *l, ListItem *i1, ListItem *i2 = 0, ListItem *i3 = 0,
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      ListItem *i4 = 0, ListItem *i5 = 0, ListItem *i6 = 0) {
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (i1) {
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CHECK_EQ(l->front(), i1);
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    l->pop_front();
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (i2) {
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CHECK_EQ(l->front(), i2);
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    l->pop_front();
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (i3) {
452385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    CHECK_EQ(l->front(), i3);
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    l->pop_front();
475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (i4) {
495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    CHECK_EQ(l->front(), i4);
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    l->pop_front();
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (i5) {
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CHECK_EQ(l->front(), i5);
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    l->pop_front();
55f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
56f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (i6) {
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CHECK_EQ(l->front(), i6);
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    l->pop_front();
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
60a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  CHECK(l->empty());
61a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
63868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST(SanitizerCommon, IntrusiveList) {
6490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ListItem items[6];
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHECK_EQ(static_list.size(), 0);
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  List l;
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  l.clear();
69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ListItem *x = &items[0];
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ListItem *y = &items[1];
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ListItem *z = &items[2];
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ListItem *a = &items[3];
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ListItem *b = &items[4];
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ListItem *c = &items[5];
7603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
7703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  CHECK_EQ(l.size(), 0);
7803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  l.push_back(x);
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHECK_EQ(l.size(), 1);
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHECK_EQ(l.back(), x);
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHECK_EQ(l.front(), x);
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  l.pop_front();
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHECK(l.empty());
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  l.CheckConsistency();
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  l.push_front(x);
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHECK_EQ(l.size(), 1);
887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  CHECK_EQ(l.back(), x);
897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  CHECK_EQ(l.front(), x);
907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  l.pop_front();
9158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  CHECK(l.empty());
9258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  l.CheckConsistency();
9358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
94b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  l.push_front(x);
95b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  l.push_front(y);
9690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  l.push_front(z);
9790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CHECK_EQ(l.size(), 3);
98ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  CHECK_EQ(l.front(), z);
99ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  CHECK_EQ(l.back(), x);
10090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  l.CheckConsistency();
10190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
10290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  l.pop_front();
103ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  CHECK_EQ(l.size(), 2);
1040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  CHECK_EQ(l.front(), y);
1050529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  CHECK_EQ(l.back(), x);
106ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  l.pop_front();
107ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  l.pop_front();
108ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  CHECK(l.empty());
109ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  l.CheckConsistency();
1101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  l.push_back(x);
1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  l.push_back(y);
1135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  l.push_back(z);
1145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  CHECK_EQ(l.size(), 3);
1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CHECK_EQ(l.front(), x);
1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CHECK_EQ(l.back(), z);
1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  l.CheckConsistency();
1181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
11946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  l.pop_front();
12046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  CHECK_EQ(l.size(), 2);
12146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  CHECK_EQ(l.front(), y);
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHECK_EQ(l.back(), z);
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  l.pop_front();
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  l.pop_front();
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHECK(l.empty());
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  l.CheckConsistency();
1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  List l1, l2;
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  l1.clear();
1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  l2.clear();
131
132  l1.append_front(&l2);
133  CHECK(l1.empty());
134  CHECK(l2.empty());
135
136  l1.append_back(&l2);
137  CHECK(l1.empty());
138  CHECK(l2.empty());
139
140  SetList(&l1, x);
141  CheckList(&l1, x);
142
143  SetList(&l1, x, y, z);
144  SetList(&l2, a, b, c);
145  l1.append_back(&l2);
146  CheckList(&l1, x, y, z, a, b, c);
147  CHECK(l2.empty());
148}
149
150}  // namespace __sanitizer
151