Path: blob/master/test/hotspot/gtest/runtime/test_ThreadsListHandle.cpp
41144 views
/*1* Copyright (c) 2020, 2021, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*/2223#include "precompiled.hpp"24#include "runtime/thread.inline.hpp"25#include "runtime/threadSMR.hpp"26#include "unittest.hpp"2728class ThreadsListHandleTest : public ::testing::Test {29public:30// Accessors for the Threads class:31//32// Return the protected Thread::_threads_hazard_ptr field:33static ThreadsList* get_Thread_threads_hazard_ptr(Thread* thr) {34return thr->get_threads_hazard_ptr();35}36// Return the protected Thread::_threads_list_ptr field:37static SafeThreadsListPtr* get_Thread_threads_list_ptr(Thread* thr) {38return thr->_threads_list_ptr;39}40// Return the protected Thread::_nested_threads_hazard_ptr_cnt field:41static uint get_Thread_nested_threads_hazard_ptr_cnt(Thread* thr) {42return thr->nested_threads_hazard_ptr_cnt();43}4445// Accessors for the ThreadsListHandle class:46//47// Return the private ThreadsListHandle::_list_ptr field:48static SafeThreadsListPtr* get_TLH_list_ptr(ThreadsListHandle* tlh_p) {49return &tlh_p->_list_ptr;50}5152// Accessors for the ThreadsList class:53//54// Return the private ThreadsList::_nested_handle_cnt field:55static intx get_TL_nested_handle_cnt(ThreadsList* tl_p) {56return tl_p->_nested_handle_cnt;57}5859// Accessors for the SafeThreadsListPtr class:60//61// Return the private SafeThreadsListPtr::_thread field:62static Thread* get_STLP_thread(SafeThreadsListPtr* stlp_p) {63return stlp_p->_thread;64}65// Return the private SafeThreadsListPtr::_has_ref_count field:66static bool get_STLP_has_ref_count(SafeThreadsListPtr* stlp_p) {67return stlp_p->_has_ref_count;68}69// Return the private SafeThreadsListPtr::_needs_release field:70static bool get_STLP_needs_release(SafeThreadsListPtr* stlp_p) {71return stlp_p->_needs_release;72}73};7475TEST_VM(ThreadsListHandle, sanity) {76bool saved_flag_val = EnableThreadSMRStatistics;77EnableThreadSMRStatistics = true; // enable Thread::_nested_threads_hazard_ptr_cnt7879Thread* thr = Thread::current();8081// Test case: no ThreadsListHandle82//8384// Verify the current thread refers to no ThreadsListHandle:85EXPECT_EQ(ThreadsListHandleTest::get_Thread_threads_hazard_ptr(thr), (ThreadsList*)NULL)86<< "thr->_threads_hazard_ptr must be NULL";87EXPECT_EQ(ThreadsListHandleTest::get_Thread_threads_list_ptr(thr), (SafeThreadsListPtr*) NULL)88<< "thr->_threads_list_ptr must be NULL";89EXPECT_EQ(ThreadsListHandleTest::get_Thread_nested_threads_hazard_ptr_cnt(thr), (uint)0)90<< "thr->_nested_threads_hazard_ptr_cnt must be 0";9192// Test case: single ThreadsListHandle, no recursion93//94{95ThreadsListHandle tlh1;96SafeThreadsListPtr* list_ptr1 = ThreadsListHandleTest::get_TLH_list_ptr(&tlh1);9798// Verify the current thread refers to tlh1:99EXPECT_EQ(ThreadsListHandleTest::get_Thread_threads_hazard_ptr(thr), tlh1.list())100<< "thr->_threads_hazard_ptr must match tlh1.list()";101EXPECT_EQ(ThreadsListHandleTest::get_Thread_threads_list_ptr(thr), list_ptr1)102<< "thr->_threads_list_ptr must match list_ptr1";103EXPECT_EQ(ThreadsListHandleTest::get_Thread_nested_threads_hazard_ptr_cnt(thr), (uint)0)104<< "thr->_nested_threads_hazard_ptr_cnt must be 0";105106// Verify tlh1 has the right field values:107EXPECT_EQ(list_ptr1->previous(), (SafeThreadsListPtr*)NULL)108<< "list_ptr1->previous() must be NULL";109EXPECT_EQ(ThreadsListHandleTest::get_STLP_thread(list_ptr1), thr)110<< "list_ptr1->_thread must match current thread";111EXPECT_EQ(list_ptr1->list(), tlh1.list())112<< "list_ptr1->list() must match tlh1.list()";113EXPECT_EQ(ThreadsListHandleTest::get_STLP_has_ref_count(list_ptr1), false)114<< "list_ptr1->_has_ref_count must be false";115EXPECT_EQ(ThreadsListHandleTest::get_STLP_needs_release(list_ptr1), true)116<< "list_ptr1->_needs_release must be true";117118// Verify tlh1 ThreadsList has the right field values:119EXPECT_EQ(ThreadsListHandleTest::get_TL_nested_handle_cnt(list_ptr1->list()), (intx)0)120<< "list_ptr1->list()->_nested_handle_cnt must be 0";121} // destroy tlh1122123// Test case: after first ThreadsListHandle (tlh1) has been destroyed124//125126// Verify the current thread refers to no ThreadsListHandle:127EXPECT_EQ(ThreadsListHandleTest::get_Thread_threads_hazard_ptr(thr), (ThreadsList*)NULL)128<< "thr->_threads_hazard_ptr must match be NULL";129EXPECT_EQ(ThreadsListHandleTest::get_Thread_threads_list_ptr(thr), (SafeThreadsListPtr*) NULL)130<< "thr->_threads_list_ptr must be NULL";131EXPECT_EQ(ThreadsListHandleTest::get_Thread_nested_threads_hazard_ptr_cnt(thr), (uint)0)132<< "thr->_nested_threads_hazard_ptr_cnt must be 0";133134// Test case: first ThreadsListHandle to prepare for nesting135//136{137ThreadsListHandle tlh1;138SafeThreadsListPtr* list_ptr1 = ThreadsListHandleTest::get_TLH_list_ptr(&tlh1);139140// Verify the current thread refers to tlh1:141EXPECT_EQ(ThreadsListHandleTest::get_Thread_threads_hazard_ptr(thr), tlh1.list())142<< "thr->_threads_hazard_ptr must match tlh1.list()";143EXPECT_EQ(ThreadsListHandleTest::get_Thread_threads_list_ptr(thr), list_ptr1)144<< "thr->_threads_list_ptr must match list_ptr1";145EXPECT_EQ(ThreadsListHandleTest::get_Thread_nested_threads_hazard_ptr_cnt(thr), (uint)0)146<< "thr->_nested_threads_hazard_ptr_cnt must be 0";147148// Verify tlh1 has the right field values:149EXPECT_EQ(list_ptr1->previous(), (SafeThreadsListPtr*)NULL)150<< "list_ptr1->previous() must be NULL";151EXPECT_EQ(ThreadsListHandleTest::get_STLP_thread(list_ptr1), thr)152<< "list_ptr1->_thread must match current thread";153EXPECT_EQ(list_ptr1->list(), tlh1.list())154<< "list_ptr1->list() must match tlh1.list()";155EXPECT_EQ(ThreadsListHandleTest::get_STLP_has_ref_count(list_ptr1), false)156<< "list_ptr1->_has_ref_count must be false";157EXPECT_EQ(ThreadsListHandleTest::get_STLP_needs_release(list_ptr1), true)158<< "list_ptr1->_needs_release must be true";159160// Verify tlh1 ThreadsList has the right field values:161EXPECT_EQ(ThreadsListHandleTest::get_TL_nested_handle_cnt(list_ptr1->list()), (intx)0)162<< "list_ptr1->list()->_nested_handle_cnt must be 0";163164// Test case: first nested ThreadsListHandle165//166{167ThreadsListHandle tlh2;168SafeThreadsListPtr* list_ptr2 = ThreadsListHandleTest::get_TLH_list_ptr(&tlh2);169170// Verify the current thread refers to tlh2:171EXPECT_EQ(ThreadsListHandleTest::get_Thread_threads_hazard_ptr(thr), tlh2.list())172<< "thr->_threads_hazard_ptr must match tlh2.list()";173EXPECT_EQ(tlh1.list(), tlh2.list())174<< "tlh1.list() must match tlh2.list()";175EXPECT_EQ(ThreadsListHandleTest::get_Thread_threads_list_ptr(thr), list_ptr2)176<< "thr->_threads_list_ptr must match list_ptr2";177EXPECT_NE(list_ptr1, list_ptr2)178<< "list_ptr1 must not match list_ptr2";179EXPECT_EQ(ThreadsListHandleTest::get_Thread_nested_threads_hazard_ptr_cnt(thr), (uint)1)180<< "thr->_nested_threads_hazard_ptr_cnt must be 1";181182// Verify tlh2 has the right field values:183EXPECT_EQ(list_ptr2->previous(), list_ptr1)184<< "list_ptr2->previous() must be list_ptr1";185EXPECT_EQ(ThreadsListHandleTest::get_STLP_thread(list_ptr2), thr)186<< "list_ptr2->_thread must match current thread";187EXPECT_EQ(list_ptr2->list(), tlh2.list())188<< "list_ptr2->list() must match tlh2.list()";189EXPECT_EQ(ThreadsListHandleTest::get_STLP_has_ref_count(list_ptr2), false)190<< "list_ptr2->_has_ref_count must be false";191EXPECT_EQ(ThreadsListHandleTest::get_STLP_needs_release(list_ptr2), true)192<< "list_ptr2->_needs_release must be true";193194// Verify tlh1 has the right field values:195EXPECT_EQ(list_ptr1->previous(), (SafeThreadsListPtr*)NULL)196<< "list_ptr1->previous() must be NULL";197EXPECT_EQ(ThreadsListHandleTest::get_STLP_thread(list_ptr1), thr)198<< "list_ptr1->_thread must match current thread";199EXPECT_EQ(list_ptr1->list(), tlh1.list())200<< "list_ptr1->list() must match tlh1.list()";201// When tlh2 was created, tlh1's _has_ref_count was set to true and202// tlh1's list->_nested_handle_cnt was incremented.203EXPECT_EQ(ThreadsListHandleTest::get_STLP_has_ref_count(list_ptr1), true)204<< "list_ptr1->_has_ref_count must be true";205EXPECT_EQ(ThreadsListHandleTest::get_STLP_needs_release(list_ptr1), true)206<< "list_ptr1->_needs_release must be true";207208// Verify tlh1 ThreadsList has the right field values:209EXPECT_EQ(ThreadsListHandleTest::get_TL_nested_handle_cnt(list_ptr1->list()), (intx)1)210<< "list_ptr1->list()->_nested_handle_cnt must be 1";211} // destroy tlh2212213// Test case: after first nested ThreadsListHandle (tlh2) has been destroyed214215// Verify the current thread's hazard ptr is NULL:216EXPECT_EQ(ThreadsListHandleTest::get_Thread_threads_hazard_ptr(thr), (ThreadsList*)NULL)217<< "thr->_threads_hazard_ptr must be NULL";218// Verify the current thread's threads list ptr refers to tlh1:219EXPECT_EQ(ThreadsListHandleTest::get_Thread_threads_list_ptr(thr), list_ptr1)220<< "thr->_threads_list_ptr must match list_ptr1";221EXPECT_EQ(ThreadsListHandleTest::get_Thread_nested_threads_hazard_ptr_cnt(thr), (uint)0)222<< "thr->_nested_threads_hazard_ptr_cnt must be 0";223224// Verify tlh1 has the right field values:225EXPECT_EQ(list_ptr1->previous(), (SafeThreadsListPtr*)NULL)226<< "list_ptr1->previous() must be NULL";227EXPECT_EQ(ThreadsListHandleTest::get_STLP_thread(list_ptr1), thr)228<< "list_ptr1->_thread must match current thread";229EXPECT_EQ(list_ptr1->list(), tlh1.list())230<< "list_ptr1->list() must match tlh1.list()";231// When tlh2 was created, tlh1's _has_ref_count was set to true and232// tlh1's list->_nested_handle_cnt was incremented.233EXPECT_EQ(ThreadsListHandleTest::get_STLP_has_ref_count(list_ptr1), true)234<< "list_ptr1->_has_ref_count must be true";235EXPECT_EQ(ThreadsListHandleTest::get_STLP_needs_release(list_ptr1), true)236<< "list_ptr1->_needs_release must be true";237238// Verify tlh1 ThreadsList has the right field values:239EXPECT_EQ(ThreadsListHandleTest::get_TL_nested_handle_cnt(list_ptr1->list()), (intx)1)240<< "list_ptr1->list()->_nested_handle_cnt must be 1";241} // destroy tlh1242243// Test case: after first ThreadsListHandle to prepare for nesting has been destroyed244//245246// Verify the current thread refers to no ThreadsListHandle:247EXPECT_EQ(ThreadsListHandleTest::get_Thread_threads_hazard_ptr(thr), (ThreadsList*)NULL)248<< "thr->_threads_hazard_ptr must match be NULL";249EXPECT_EQ(ThreadsListHandleTest::get_Thread_threads_list_ptr(thr), (SafeThreadsListPtr*) NULL)250<< "thr->_threads_list_ptr must be NULL";251EXPECT_EQ(ThreadsListHandleTest::get_Thread_nested_threads_hazard_ptr_cnt(thr), (uint)0)252<< "thr->_nested_threads_hazard_ptr_cnt must be 0";253254// Test case: first ThreadsListHandle to prepare for double nesting255//256{257ThreadsListHandle tlh1;258SafeThreadsListPtr* list_ptr1 = ThreadsListHandleTest::get_TLH_list_ptr(&tlh1);259260// Verify the current thread refers to tlh1:261EXPECT_EQ(ThreadsListHandleTest::get_Thread_threads_hazard_ptr(thr), tlh1.list())262<< "thr->_threads_hazard_ptr must match tlh1.list()";263EXPECT_EQ(ThreadsListHandleTest::get_Thread_threads_list_ptr(thr), list_ptr1)264<< "thr->_threads_list_ptr must match list_ptr1";265EXPECT_EQ(ThreadsListHandleTest::get_Thread_nested_threads_hazard_ptr_cnt(thr), (uint)0)266<< "thr->_nested_threads_hazard_ptr_cnt must be 0";267268// Verify tlh1 has the right field values:269EXPECT_EQ(list_ptr1->previous(), (SafeThreadsListPtr*)NULL)270<< "list_ptr1->previous() must be NULL";271EXPECT_EQ(ThreadsListHandleTest::get_STLP_thread(list_ptr1), thr)272<< "list_ptr1->_thread must match current thread";273EXPECT_EQ(list_ptr1->list(), tlh1.list())274<< "list_ptr1->list() must match tlh1.list()";275EXPECT_EQ(ThreadsListHandleTest::get_STLP_has_ref_count(list_ptr1), false)276<< "list_ptr1->_has_ref_count must be false";277EXPECT_EQ(ThreadsListHandleTest::get_STLP_needs_release(list_ptr1), true)278<< "list_ptr1->_needs_release must be true";279280// Verify tlh1 ThreadsList has the right field values:281EXPECT_EQ(ThreadsListHandleTest::get_TL_nested_handle_cnt(list_ptr1->list()), (intx)0)282<< "list_ptr1->list()->_nested_handle_cnt must be 0";283284// Test case: first nested ThreadsListHandle285//286{287ThreadsListHandle tlh2;288SafeThreadsListPtr* list_ptr2 = ThreadsListHandleTest::get_TLH_list_ptr(&tlh2);289290// Verify the current thread refers to tlh2:291EXPECT_EQ(ThreadsListHandleTest::get_Thread_threads_hazard_ptr(thr), tlh2.list())292<< "thr->_threads_hazard_ptr must match tlh2.list()";293EXPECT_EQ(tlh1.list(), tlh2.list())294<< "tlh1.list() must match tlh2.list()";295EXPECT_EQ(ThreadsListHandleTest::get_Thread_threads_list_ptr(thr), list_ptr2)296<< "thr->_threads_list_ptr must match list_ptr2";297EXPECT_NE(list_ptr1, list_ptr2)298<< "list_ptr1 must not match list_ptr2";299EXPECT_EQ(ThreadsListHandleTest::get_Thread_nested_threads_hazard_ptr_cnt(thr), (uint)1)300<< "thr->_nested_threads_hazard_ptr_cnt must be 1";301302// Verify tlh2 has the right field values:303EXPECT_EQ(list_ptr2->previous(), list_ptr1)304<< "list_ptr2->previous() must be list_ptr1";305EXPECT_EQ(ThreadsListHandleTest::get_STLP_thread(list_ptr2), thr)306<< "list_ptr2->_thread must match current thread";307EXPECT_EQ(list_ptr2->list(), tlh2.list())308<< "list_ptr2->list() must match tlh2.list()";309EXPECT_EQ(ThreadsListHandleTest::get_STLP_has_ref_count(list_ptr2), false)310<< "list_ptr2->_has_ref_count must be false";311EXPECT_EQ(ThreadsListHandleTest::get_STLP_needs_release(list_ptr2), true)312<< "list_ptr2->_needs_release must be true";313314// Verify tlh1 has the right field values:315EXPECT_EQ(list_ptr1->previous(), (SafeThreadsListPtr*)NULL)316<< "list_ptr1->previous() must be NULL";317EXPECT_EQ(ThreadsListHandleTest::get_STLP_thread(list_ptr1), thr)318<< "list_ptr1->_thread must match current thread";319EXPECT_EQ(list_ptr1->list(), tlh1.list())320<< "list_ptr1->list() must match tlh1.list()";321// When tlh2 was created, tlh1's _has_ref_count was set to true and322// tlh1's list->_nested_handle_cnt was incremented.323EXPECT_EQ(ThreadsListHandleTest::get_STLP_has_ref_count(list_ptr1), true)324<< "list_ptr1->_has_ref_count must be true";325EXPECT_EQ(ThreadsListHandleTest::get_STLP_needs_release(list_ptr1), true)326<< "list_ptr1->_needs_release must be true";327328// Verify tlh1 ThreadsList has the right field values:329EXPECT_EQ(ThreadsListHandleTest::get_TL_nested_handle_cnt(list_ptr1->list()), (intx)1)330<< "list_ptr1->list()->_nested_handle_cnt must be 1";331332// Test case: double nested ThreadsListHandle333//334{335ThreadsListHandle tlh3;336SafeThreadsListPtr* list_ptr3 = ThreadsListHandleTest::get_TLH_list_ptr(&tlh3);337338// Verify the current thread refers to tlh3:339EXPECT_EQ(ThreadsListHandleTest::get_Thread_threads_hazard_ptr(thr), tlh3.list())340<< "thr->_threads_hazard_ptr must match tlh3.list()";341EXPECT_EQ(tlh1.list(), tlh3.list())342<< "tlh1.list() must match tlh3.list()";343EXPECT_EQ(ThreadsListHandleTest::get_Thread_threads_list_ptr(thr), list_ptr3)344<< "thr->_threads_list_ptr must match list_ptr3";345EXPECT_NE(list_ptr1, list_ptr3)346<< "list_ptr1 must not match list_ptr3";347EXPECT_NE(list_ptr2, list_ptr3)348<< "list_ptr. must not match list_ptr3";349EXPECT_EQ(ThreadsListHandleTest::get_Thread_nested_threads_hazard_ptr_cnt(thr), (uint)2)350<< "thr->_nested_threads_hazard_ptr_cnt must be 2";351352// Verify tlh3 has the right field values:353EXPECT_EQ(list_ptr3->previous(), list_ptr2)354<< "list_ptr3->previous() must be list_ptr2";355EXPECT_EQ(ThreadsListHandleTest::get_STLP_thread(list_ptr3), thr)356<< "list_ptr3->_thread must match current thread";357EXPECT_EQ(list_ptr3->list(), tlh3.list())358<< "list_ptr3->list() must match tlh3.list()";359EXPECT_EQ(ThreadsListHandleTest::get_STLP_has_ref_count(list_ptr3), false)360<< "list_ptr3->_has_ref_count must be false";361EXPECT_EQ(ThreadsListHandleTest::get_STLP_needs_release(list_ptr3), true)362<< "list_ptr3->_needs_release must be true";363364// Verify tlh2 has the right field values:365EXPECT_EQ(list_ptr2->previous(), list_ptr1)366<< "list_ptr2->previous() must be list_ptr1";367EXPECT_EQ(ThreadsListHandleTest::get_STLP_thread(list_ptr2), thr)368<< "list_ptr2->_thread must match current thread";369EXPECT_EQ(list_ptr2->list(), tlh2.list())370<< "list_ptr2->list() must match tlh2.list()";371// When tlh3 was created, tlh2's _has_ref_count was set to true and372// tlh2's list->_nested_handle_cnt was incremented.373EXPECT_EQ(ThreadsListHandleTest::get_STLP_has_ref_count(list_ptr2), true)374<< "list_ptr2->_has_ref_count must be true";375EXPECT_EQ(ThreadsListHandleTest::get_STLP_needs_release(list_ptr2), true)376<< "list_ptr2->_needs_release must be true";377378// Verify tlh1 has the right field values:379EXPECT_EQ(list_ptr1->previous(), (SafeThreadsListPtr*)NULL)380<< "list_ptr1->previous() must be NULL";381EXPECT_EQ(ThreadsListHandleTest::get_STLP_thread(list_ptr1), thr)382<< "list_ptr1->_thread must match current thread";383EXPECT_EQ(list_ptr1->list(), tlh1.list())384<< "list_ptr1->list() must match tlh1.list()";385// When tlh2 was created, tlh1's _has_ref_count was set to true and386// tlh1's list->_nested_handle_cnt was incremented.387EXPECT_EQ(ThreadsListHandleTest::get_STLP_has_ref_count(list_ptr1), true)388<< "list_ptr1->_has_ref_count must be true";389EXPECT_EQ(ThreadsListHandleTest::get_STLP_needs_release(list_ptr1), true)390<< "list_ptr1->_needs_release must be true";391392// Verify tlh1 ThreadsList has the right field values:393EXPECT_EQ(ThreadsListHandleTest::get_TL_nested_handle_cnt(list_ptr1->list()), (intx)2)394<< "list_ptr1->list()->_nested_handle_cnt must be 2";395} // destroy tlh3396397// Test case: after double nested ThreadsListHandle (tlh3) has been destroyed398399// Verify the current thread's hazard ptr is NULL:400EXPECT_EQ(ThreadsListHandleTest::get_Thread_threads_hazard_ptr(thr), (ThreadsList*)NULL)401<< "thr->_threads_hazard_ptr must be NULL";402// Verify the current thread's threads list ptr refers to tlh2:403EXPECT_EQ(tlh1.list(), tlh2.list())404<< "tlh1.list() must match tlh2.list()";405EXPECT_EQ(ThreadsListHandleTest::get_Thread_threads_list_ptr(thr), list_ptr2)406<< "thr->_threads_list_ptr must match list_ptr2";407EXPECT_NE(list_ptr1, list_ptr2)408<< "list_ptr1 must not match list_ptr2";409EXPECT_EQ(ThreadsListHandleTest::get_Thread_nested_threads_hazard_ptr_cnt(thr), (uint)1)410<< "thr->_nested_threads_hazard_ptr_cnt must be 1";411412// Verify tlh2 has the right field values:413EXPECT_EQ(list_ptr2->previous(), list_ptr1)414<< "list_ptr2->previous() must be list_ptr1";415EXPECT_EQ(ThreadsListHandleTest::get_STLP_thread(list_ptr2), thr)416<< "list_ptr2->_thread must match current thread";417EXPECT_EQ(list_ptr2->list(), tlh2.list())418<< "list_ptr2->list() must match tlh2.list()";419// When tlh3 was created, tlh2's _has_ref_count was set to true and420// tlh2's list->_nested_handle_cnt was incremented.421EXPECT_EQ(ThreadsListHandleTest::get_STLP_has_ref_count(list_ptr2), true)422<< "list_ptr2->_has_ref_count must be true";423EXPECT_EQ(ThreadsListHandleTest::get_STLP_needs_release(list_ptr2), true)424<< "list_ptr2->_needs_release must be true";425426// Verify tlh1 has the right field values:427EXPECT_EQ(list_ptr1->previous(), (SafeThreadsListPtr*)NULL)428<< "list_ptr1->previous() must be NULL";429EXPECT_EQ(ThreadsListHandleTest::get_STLP_thread(list_ptr1), thr)430<< "list_ptr1->_thread must match current thread";431EXPECT_EQ(list_ptr1->list(), tlh1.list())432<< "list_ptr1->list() must match tlh1.list()";433// When tlh2 was created, tlh1's _has_ref_count was set to true and434// tlh1's list->_nested_handle_cnt was incremented.435EXPECT_EQ(ThreadsListHandleTest::get_STLP_has_ref_count(list_ptr1), true)436<< "list_ptr1->_has_ref_count must be true";437EXPECT_EQ(ThreadsListHandleTest::get_STLP_needs_release(list_ptr1), true)438<< "list_ptr1->_needs_release must be true";439440// Verify tlh1 ThreadsList has the right field values:441EXPECT_EQ(ThreadsListHandleTest::get_TL_nested_handle_cnt(list_ptr1->list()), (intx)2)442<< "list_ptr1->list()->_nested_handle_cnt must be 2";443} // destroy tlh2444445// Test case: after first nested ThreadsListHandle (tlh2) has been destroyed446447// Verify the current thread's hazard ptr is NULL:448EXPECT_EQ(ThreadsListHandleTest::get_Thread_threads_hazard_ptr(thr), (ThreadsList*)NULL)449<< "thr->_threads_hazard_ptr must be NULL";450// Verify the current thread's threads list ptr refers to tlh1:451EXPECT_EQ(ThreadsListHandleTest::get_Thread_threads_list_ptr(thr), list_ptr1)452<< "thr->_threads_list_ptr must match list_ptr1";453EXPECT_EQ(ThreadsListHandleTest::get_Thread_nested_threads_hazard_ptr_cnt(thr), (uint)0)454<< "thr->_nested_threads_hazard_ptr_cnt must be 0";455456// Verify tlh1 has the right field values:457EXPECT_EQ(list_ptr1->previous(), (SafeThreadsListPtr*)NULL)458<< "list_ptr1->previous() must be NULL";459EXPECT_EQ(ThreadsListHandleTest::get_STLP_thread(list_ptr1), thr)460<< "list_ptr1->_thread must match current thread";461EXPECT_EQ(list_ptr1->list(), tlh1.list())462<< "list_ptr1->list() must match tlh1.list()";463// When tlh2 was created, tlh1's _has_ref_count was set to true and464// tlh1's list->_nested_handle_cnt was incremented.465EXPECT_EQ(ThreadsListHandleTest::get_STLP_has_ref_count(list_ptr1), true)466<< "list_ptr1->_has_ref_count must be true";467EXPECT_EQ(ThreadsListHandleTest::get_STLP_needs_release(list_ptr1), true)468<< "list_ptr1->_needs_release must be true";469470// Verify tlh1 ThreadsList has the right field values:471EXPECT_EQ(ThreadsListHandleTest::get_TL_nested_handle_cnt(list_ptr1->list()), (intx)1)472<< "list_ptr1->list()->_nested_handle_cnt must be 1";473} // destroy tlh1474475// Test case: after first ThreadsListHandle to prepare for double nesting has been destroyed476//477478// Verify the current thread refers to no ThreadsListHandle:479EXPECT_EQ(ThreadsListHandleTest::get_Thread_threads_hazard_ptr(thr), (ThreadsList*)NULL)480<< "thr->_threads_hazard_ptr must match be NULL";481EXPECT_EQ(ThreadsListHandleTest::get_Thread_threads_list_ptr(thr), (SafeThreadsListPtr*) NULL)482<< "thr->_threads_list_ptr must be NULL";483EXPECT_EQ(ThreadsListHandleTest::get_Thread_nested_threads_hazard_ptr_cnt(thr), (uint)0)484<< "thr->_nested_threads_hazard_ptr_cnt must be 0";485486// Test case: first ThreadsListHandle to prepare for back-to-back nesting487//488{489ThreadsListHandle tlh1;490SafeThreadsListPtr* list_ptr1 = ThreadsListHandleTest::get_TLH_list_ptr(&tlh1);491492// Verify the current thread refers to tlh1:493EXPECT_EQ(ThreadsListHandleTest::get_Thread_threads_hazard_ptr(thr), tlh1.list())494<< "thr->_threads_hazard_ptr must match tlh1.list()";495EXPECT_EQ(ThreadsListHandleTest::get_Thread_threads_list_ptr(thr), list_ptr1)496<< "thr->_threads_list_ptr must match list_ptr1";497EXPECT_EQ(ThreadsListHandleTest::get_Thread_nested_threads_hazard_ptr_cnt(thr), (uint)0)498<< "thr->_nested_threads_hazard_ptr_cnt must be 0";499500// Verify tlh1 has the right field values:501EXPECT_EQ(list_ptr1->previous(), (SafeThreadsListPtr*)NULL)502<< "list_ptr1->previous() must be NULL";503EXPECT_EQ(ThreadsListHandleTest::get_STLP_thread(list_ptr1), thr)504<< "list_ptr1->_thread must match current thread";505EXPECT_EQ(list_ptr1->list(), tlh1.list())506<< "list_ptr1->list() must match tlh1.list()";507EXPECT_EQ(ThreadsListHandleTest::get_STLP_has_ref_count(list_ptr1), false)508<< "list_ptr1->_has_ref_count must be false";509EXPECT_EQ(ThreadsListHandleTest::get_STLP_needs_release(list_ptr1), true)510<< "list_ptr1->_needs_release must be true";511512// Verify tlh1 ThreadsList has the right field values:513EXPECT_EQ(ThreadsListHandleTest::get_TL_nested_handle_cnt(list_ptr1->list()), (intx)0)514<< "list_ptr1->list()->_nested_handle_cnt must be 0";515516// Test case: first back-to-back nested ThreadsListHandle517//518{519ThreadsListHandle tlh2a;520SafeThreadsListPtr* list_ptr2a = ThreadsListHandleTest::get_TLH_list_ptr(&tlh2a);521522// Verify the current thread refers to tlh2a:523EXPECT_EQ(ThreadsListHandleTest::get_Thread_threads_hazard_ptr(thr), tlh2a.list())524<< "thr->_threads_hazard_ptr must match tlh2a.list()";525EXPECT_EQ(tlh1.list(), tlh2a.list())526<< "tlh1.list() must match tlh2a.list()";527EXPECT_EQ(ThreadsListHandleTest::get_Thread_threads_list_ptr(thr), list_ptr2a)528<< "thr->_threads_list_ptr must match list_ptr2a";529EXPECT_NE(list_ptr1, list_ptr2a)530<< "list_ptr1 must not match list_ptr2a";531EXPECT_EQ(ThreadsListHandleTest::get_Thread_nested_threads_hazard_ptr_cnt(thr), (uint)1)532<< "thr->_nested_threads_hazard_ptr_cnt must be 1";533534// Verify tlh2a has the right field values:535EXPECT_EQ(list_ptr2a->previous(), list_ptr1)536<< "list_ptr2a->previous() must be list_ptr1";537EXPECT_EQ(ThreadsListHandleTest::get_STLP_thread(list_ptr2a), thr)538<< "list_ptr2a->_thread must match current thread";539EXPECT_EQ(list_ptr2a->list(), tlh2a.list())540<< "list_ptr2a->list() must match tlh2a.list()";541EXPECT_EQ(ThreadsListHandleTest::get_STLP_has_ref_count(list_ptr2a), false)542<< "list_ptr2a->_has_ref_count must be false";543EXPECT_EQ(ThreadsListHandleTest::get_STLP_needs_release(list_ptr2a), true)544<< "list_ptr2a->_needs_release must be true";545546// Verify tlh1 has the right field values:547EXPECT_EQ(list_ptr1->previous(), (SafeThreadsListPtr*)NULL)548<< "list_ptr1->previous() must be NULL";549EXPECT_EQ(ThreadsListHandleTest::get_STLP_thread(list_ptr1), thr)550<< "list_ptr1->_thread must match current thread";551EXPECT_EQ(list_ptr1->list(), tlh1.list())552<< "list_ptr1->list() must match tlh1.list()";553// When tlh2a was created, tlh1's _has_ref_count was set to true and554// tlh1's list->_nested_handle_cnt was incremented.555EXPECT_EQ(ThreadsListHandleTest::get_STLP_has_ref_count(list_ptr1), true)556<< "list_ptr1->_has_ref_count must be true";557EXPECT_EQ(ThreadsListHandleTest::get_STLP_needs_release(list_ptr1), true)558<< "list_ptr1->_needs_release must be true";559560// Verify tlh1 ThreadsList has the right field values:561EXPECT_EQ(ThreadsListHandleTest::get_TL_nested_handle_cnt(list_ptr1->list()), (intx)1)562<< "list_ptr1->list()->_nested_handle_cnt must be 1";563} // destroy tlh2a564565// Test case: after first back-to-back nested ThreadsListHandle (tlh2a) has been destroyed566567// Verify the current thread's hazard ptr is NULL:568EXPECT_EQ(ThreadsListHandleTest::get_Thread_threads_hazard_ptr(thr), (ThreadsList*)NULL)569<< "thr->_threads_hazard_ptr must be NULL";570// Verify the current thread's threads list ptr refers to tlh1:571EXPECT_EQ(ThreadsListHandleTest::get_Thread_threads_list_ptr(thr), list_ptr1)572<< "thr->_threads_list_ptr must match list_ptr1";573EXPECT_EQ(ThreadsListHandleTest::get_Thread_nested_threads_hazard_ptr_cnt(thr), (uint)0)574<< "thr->_nested_threads_hazard_ptr_cnt must be 0";575576// Verify tlh1 has the right field values:577EXPECT_EQ(list_ptr1->previous(), (SafeThreadsListPtr*)NULL)578<< "list_ptr1->previous() must be NULL";579EXPECT_EQ(ThreadsListHandleTest::get_STLP_thread(list_ptr1), thr)580<< "list_ptr1->_thread must match current thread";581EXPECT_EQ(list_ptr1->list(), tlh1.list())582<< "list_ptr1->list() must match tlh1.list()";583// When tlh2a was created, tlh1's _has_ref_count was set to true and584// tlh1's list->_nested_handle_cnt was incremented.585EXPECT_EQ(ThreadsListHandleTest::get_STLP_has_ref_count(list_ptr1), true)586<< "list_ptr1->_has_ref_count must be true";587EXPECT_EQ(ThreadsListHandleTest::get_STLP_needs_release(list_ptr1), true)588<< "list_ptr1->_needs_release must be true";589590// Verify tlh1 ThreadsList has the right field values:591EXPECT_EQ(ThreadsListHandleTest::get_TL_nested_handle_cnt(list_ptr1->list()), (intx)1)592<< "list_ptr1->list()->_nested_handle_cnt must be 1";593594// Test case: second back-to-back nested ThreadsListHandle595//596{597ThreadsListHandle tlh2b;598SafeThreadsListPtr* list_ptr2b = ThreadsListHandleTest::get_TLH_list_ptr(&tlh2b);599600// Verify the current thread refers to tlh2b:601EXPECT_EQ(ThreadsListHandleTest::get_Thread_threads_hazard_ptr(thr), tlh2b.list())602<< "thr->_threads_hazard_ptr must match tlh2b.list()";603EXPECT_EQ(tlh1.list(), tlh2b.list())604<< "tlh1.list() must match tlh2b.list()";605EXPECT_EQ(ThreadsListHandleTest::get_Thread_threads_list_ptr(thr), list_ptr2b)606<< "thr->_threads_list_ptr must match list_ptr2b";607EXPECT_NE(list_ptr1, list_ptr2b)608<< "list_ptr1 must not match list_ptr2b";609EXPECT_EQ(ThreadsListHandleTest::get_Thread_nested_threads_hazard_ptr_cnt(thr), (uint)1)610<< "thr->_nested_threads_hazard_ptr_cnt must be 1";611612// Verify tlh2b has the right field values:613EXPECT_EQ(list_ptr2b->previous(), list_ptr1)614<< "list_ptr2b->previous() must be list_ptr1";615EXPECT_EQ(ThreadsListHandleTest::get_STLP_thread(list_ptr2b), thr)616<< "list_ptr2b->_thread must match current thread";617EXPECT_EQ(list_ptr2b->list(), tlh2b.list())618<< "list_ptr2b->list() must match tlh2b.list()";619EXPECT_EQ(ThreadsListHandleTest::get_STLP_has_ref_count(list_ptr2b), false)620<< "list_ptr2b->_has_ref_count must be false";621EXPECT_EQ(ThreadsListHandleTest::get_STLP_needs_release(list_ptr2b), true)622<< "list_ptr2b->_needs_release must be true";623624// Verify tlh1 has the right field values:625EXPECT_EQ(list_ptr1->previous(), (SafeThreadsListPtr*)NULL)626<< "list_ptr1->previous() must be NULL";627EXPECT_EQ(ThreadsListHandleTest::get_STLP_thread(list_ptr1), thr)628<< "list_ptr1->_thread must match current thread";629EXPECT_EQ(list_ptr1->list(), tlh1.list())630<< "list_ptr1->list() must match tlh1.list()";631// When tlh2a was created, tlh1's _has_ref_count was set to true and632// tlh1's list->_nested_handle_cnt was incremented.633EXPECT_EQ(ThreadsListHandleTest::get_STLP_has_ref_count(list_ptr1), true)634<< "list_ptr1->_has_ref_count must be true";635EXPECT_EQ(ThreadsListHandleTest::get_STLP_needs_release(list_ptr1), true)636<< "list_ptr1->_needs_release must be true";637638// Verify tlh1 ThreadsList has the right field values:639EXPECT_EQ(ThreadsListHandleTest::get_TL_nested_handle_cnt(list_ptr1->list()), (intx)1)640<< "list_ptr1->list()->_nested_handle_cnt must be 1";641} // destroy tlh2b642643// Test case: after second back-to-back nested ThreadsListHandle (tlh2b) has been destroyed644645// Verify the current thread's hazard ptr is NULL:646EXPECT_EQ(ThreadsListHandleTest::get_Thread_threads_hazard_ptr(thr), (ThreadsList*)NULL)647<< "thr->_threads_hazard_ptr must be NULL";648// Verify the current thread's threads list ptr refers to tlh1:649EXPECT_EQ(ThreadsListHandleTest::get_Thread_threads_list_ptr(thr), list_ptr1)650<< "thr->_threads_list_ptr must match list_ptr1";651EXPECT_EQ(ThreadsListHandleTest::get_Thread_nested_threads_hazard_ptr_cnt(thr), (uint)0)652<< "thr->_nested_threads_hazard_ptr_cnt must be 0";653654// Verify tlh1 has the right field values:655EXPECT_EQ(list_ptr1->previous(), (SafeThreadsListPtr*)NULL)656<< "list_ptr1->previous() must be NULL";657EXPECT_EQ(ThreadsListHandleTest::get_STLP_thread(list_ptr1), thr)658<< "list_ptr1->_thread must match current thread";659EXPECT_EQ(list_ptr1->list(), tlh1.list())660<< "list_ptr1->list() must match tlh1.list()";661// When tlh2a was created, tlh1's _has_ref_count was set to true and662// tlh1's list->_nested_handle_cnt was incremented.663EXPECT_EQ(ThreadsListHandleTest::get_STLP_has_ref_count(list_ptr1), true)664<< "list_ptr1->_has_ref_count must be true";665EXPECT_EQ(ThreadsListHandleTest::get_STLP_needs_release(list_ptr1), true)666<< "list_ptr1->_needs_release must be true";667668// Verify tlh1 ThreadsList has the right field values:669EXPECT_EQ(ThreadsListHandleTest::get_TL_nested_handle_cnt(list_ptr1->list()), (intx)1)670<< "list_ptr1->list()->_nested_handle_cnt must be 1";671} // destroy tlh1672673// Test case: after first ThreadsListHandle to prepare for back-to-back nesting has been destroyed674//675676// Verify the current thread refers to no ThreadsListHandle:677EXPECT_EQ(ThreadsListHandleTest::get_Thread_threads_hazard_ptr(thr), (ThreadsList*)NULL)678<< "thr->_threads_hazard_ptr must match be NULL";679EXPECT_EQ(ThreadsListHandleTest::get_Thread_threads_list_ptr(thr), (SafeThreadsListPtr*) NULL)680<< "thr->_threads_list_ptr must be NULL";681EXPECT_EQ(ThreadsListHandleTest::get_Thread_nested_threads_hazard_ptr_cnt(thr), (uint)0)682<< "thr->_nested_threads_hazard_ptr_cnt must be 0";683684EnableThreadSMRStatistics = saved_flag_val;685}686687688