# HG changeset patch # User kzhaldyb # Date 1470401236 -10800 # Fri Aug 05 15:47:16 2016 +0300 # Node ID 5c8d5e6156160f5b95b1ed9dc1f7db46ba44fa04 # Parent dd8c45b19ef6ecb50846c292ffbe29cad7ac4a74 8159817: Convert FreeRegionList_test to GTest Reviewed-by: duke diff --git a/src/share/vm/gc/g1/heapRegionSet.cpp b/src/share/vm/gc/g1/heapRegionSet.cpp --- a/src/share/vm/gc/g1/heapRegionSet.cpp +++ b/src/share/vm/gc/g1/heapRegionSet.cpp @@ -370,50 +370,3 @@ "master humongous set MT safety protocol outside a safepoint"); } } - -void FreeRegionList_test() { - FreeRegionList l("test"); - - const uint num_regions_in_test = 5; - // Create a fake heap. It does not need to be valid, as the HeapRegion constructor - // does not access it. - MemRegion heap(NULL, num_regions_in_test * HeapRegion::GrainWords); - // Allocate a fake BOT because the HeapRegion constructor initializes - // the BOT. - size_t bot_size = G1BlockOffsetTable::compute_size(heap.word_size()); - HeapWord* bot_data = NEW_C_HEAP_ARRAY(HeapWord, bot_size, mtGC); - ReservedSpace bot_rs(G1BlockOffsetTable::compute_size(heap.word_size())); - G1RegionToSpaceMapper* bot_storage = - G1RegionToSpaceMapper::create_mapper(bot_rs, - bot_rs.size(), - os::vm_page_size(), - HeapRegion::GrainBytes, - BOTConstants::N_bytes, - mtGC); - G1BlockOffsetTable bot(heap, bot_storage); - bot_storage->commit_regions(0, num_regions_in_test); - - // Set up memory regions for the heap regions. - MemRegion mr0(heap.start(), HeapRegion::GrainWords); - MemRegion mr1(mr0.end(), HeapRegion::GrainWords); - MemRegion mr2(mr1.end(), HeapRegion::GrainWords); - MemRegion mr3(mr2.end(), HeapRegion::GrainWords); - MemRegion mr4(mr3.end(), HeapRegion::GrainWords); - - HeapRegion hr0(0, &bot, mr0); - HeapRegion hr1(1, &bot, mr1); - HeapRegion hr2(2, &bot, mr2); - HeapRegion hr3(3, &bot, mr3); - HeapRegion hr4(4, &bot, mr4); - l.add_ordered(&hr1); - l.add_ordered(&hr0); - l.add_ordered(&hr3); - l.add_ordered(&hr4); - l.add_ordered(&hr2); - assert(l.length() == num_regions_in_test, "wrong length"); - l.verify_list(); - - bot_storage->uncommit_regions(0, num_regions_in_test); - delete bot_storage; - FREE_C_HEAP_ARRAY(HeapWord, bot_data); -} diff --git a/src/share/vm/utilities/internalVMTests.cpp b/src/share/vm/utilities/internalVMTests.cpp --- a/src/share/vm/utilities/internalVMTests.cpp +++ b/src/share/vm/utilities/internalVMTests.cpp @@ -94,7 +94,6 @@ run_unit_test(TestBufferingOopClosure_test); run_unit_test(TestCodeCacheRemSet_test); if (UseG1GC) { - run_unit_test(FreeRegionList_test); run_unit_test(IHOP_test); } run_unit_test(test_memset_with_concurrent_readers); diff --git a/test/native/gc/g1/test_freeRegionList.cpp b/test/native/gc/g1/test_freeRegionList.cpp new file mode 100644 --- /dev/null +++ b/test/native/gc/g1/test_freeRegionList.cpp @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +#include "precompiled.hpp" +#include "utilities/macros.hpp" +#include "gc/g1/g1CollectedHeap.inline.hpp" +#include "unittest.hpp" + +#if INCLUDE_ALL_GCS + +TEST_OTHER_VM_WITH_FLAGS(g1, freeRegionList, (char*) "-XX:+UseG1GC") { + FreeRegionList l("test"); + const uint num_regions_in_test = 5; + + // Create a fake heap. It does not need to be valid, as the HeapRegion constructor + // does not access it. + MemRegion heap(NULL, num_regions_in_test * HeapRegion::GrainWords); + + // Allocate a fake BOT because the HeapRegion constructor initializes + // the BOT. + size_t bot_size = G1BlockOffsetTable::compute_size(heap.word_size()); + HeapWord* bot_data = NEW_C_HEAP_ARRAY(HeapWord, bot_size, mtGC); + ReservedSpace bot_rs(G1BlockOffsetTable::compute_size(heap.word_size())); + G1RegionToSpaceMapper* bot_storage = + G1RegionToSpaceMapper::create_mapper(bot_rs, + bot_rs.size(), + os::vm_page_size(), + HeapRegion::GrainBytes, + BOTConstants::N_bytes, + mtGC); + G1BlockOffsetTable bot(heap, bot_storage); + bot_storage->commit_regions(0, num_regions_in_test); + + // Set up memory regions for the heap regions. + MemRegion mr0(heap.start(), HeapRegion::GrainWords); + MemRegion mr1(mr0.end(), HeapRegion::GrainWords); + MemRegion mr2(mr1.end(), HeapRegion::GrainWords); + MemRegion mr3(mr2.end(), HeapRegion::GrainWords); + MemRegion mr4(mr3.end(), HeapRegion::GrainWords); + + HeapRegion hr0(0, &bot, mr0); + HeapRegion hr1(1, &bot, mr1); + HeapRegion hr2(2, &bot, mr2); + HeapRegion hr3(3, &bot, mr3); + HeapRegion hr4(4, &bot, mr4); + l.add_ordered(&hr1); + l.add_ordered(&hr0); + l.add_ordered(&hr3); + l.add_ordered(&hr4); + l.add_ordered(&hr2); + + ASSERT_EQ(l.length(), num_regions_in_test) << "Wrong free region list length"; + l.verify_list(); + + bot_storage->uncommit_regions(0, num_regions_in_test); + delete bot_storage; + FREE_C_HEAP_ARRAY(HeapWord, bot_data); +} +#endif \ No newline at end of file diff --git a/test/native/unittest.hpp b/test/native/unittest.hpp --- a/test/native/unittest.hpp +++ b/test/native/unittest.hpp @@ -71,6 +71,48 @@ \ void test_ ## category ## _ ## name ## _() +#define TEST_OTHER_VM_WITH_FLAGS(category, name, flags) \ + static void test_ ## category ## _ ## name ## _(); \ + \ + static void child_ ## category ## _ ## name ## _() { \ + ::testing::GTEST_FLAG(throw_on_failure) = true; \ + test_ ## category ## _ ## name ## _(); \ + fprintf(stderr, "OKIDOKI"); \ + exit(0); \ + } \ + \ + TEST(category, CONCAT(name, _other_vm_with_flags)) { \ + const char *old_flags = getenv("_JAVA_OPTIONS"); \ + const char *safe_old_flags = \ + (old_flags == NULL) ? "" : old_flags; \ + const char *safe_new_flags = (flags == NULL) ? "" : flags; \ + const size_t new_options_len = strlen("_JAVA_OPTIONS=") \ + + strlen(safe_new_flags) + 1; \ + \ + char *new_options = (char*) malloc(new_options_len); \ + jio_snprintf(new_options, new_options_len, "_JAVA_OPTIONS=%s", \ + safe_new_flags); \ + ASSERT_EQ(putenv(new_options), 0) \ + << "Unable to setup new flags: " << new_options \ + << "; errno = " << errno; \ + \ + ASSERT_EXIT(child_ ## category ## _ ## name ## _(), \ + ::testing::ExitedWithCode(0), \ + ".*OKIDOKI.*"); \ + \ + const size_t stored_options_len = strlen("_JAVA_OPTIONS=") \ + + strlen(safe_old_flags) + 1; \ + char *stored_options = (char*) malloc (stored_options_len); \ + jio_snprintf(stored_options, stored_options_len, \ + "_JAVA_OPTIONS=%s", safe_old_flags); \ + \ + ASSERT_EQ(putenv(stored_options), 0) \ + << "Unable to restore flags: " << stored_options \ + << "; errno = " << errno; \ + } \ + \ + void test_ ## category ## _ ## name ## _() + #ifdef ASSERT #define TEST_VM_ASSERT(category, name) \ static void test_ ## category ## _ ## name ## _(); \