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