--- old/test/hotspot/gtest/memory/test_virtualspace.cpp 2018-10-17 14:19:40.000000000 -0700 +++ new/test/hotspot/gtest/memory/test_virtualspace.cpp 2018-10-17 14:19:39.000000000 -0700 @@ -29,6 +29,19 @@ #include "unittest.hpp" namespace { + class MemoryReleaser { + ReservedSpace* const _rs; + public: + MemoryReleaser(ReservedSpace* rs) : _rs(rs) { } + ~MemoryReleaser() { + if (_rs->special()) { + EXPECT_TRUE(os::release_memory_special(_rs->base(), _rs->size())); + } else { + EXPECT_TRUE(os::release_memory(_rs->base(), _rs->size())); + } + } + }; + static void small_page_write(void* addr, size_t size) { size_t page_size = os::vm_page_size(); @@ -38,14 +51,6 @@ } } - static void release_memory_for_test(ReservedSpace rs) { - if (rs.special()) { - ASSERT_TRUE(os::release_memory_special(rs.base(), rs.size())); - } else { - ASSERT_TRUE(os::release_memory(rs.base(), rs.size())); - } - } - // have to use these functions, as gtest's _PRED macros don't like is_aligned // nor (is_aligned) static bool is_size_alignment(size_t size, size_t alignment) { @@ -59,6 +64,7 @@ ASSERT_PRED2(is_size_alignment, size, os::vm_allocation_granularity()); ReservedSpace rs(size); + MemoryReleaser releaser(&rs); EXPECT_TRUE(rs.base() != NULL) << "rs.special: " << rs.special(); EXPECT_EQ(size, rs.size()) << "rs.special: " << rs.special(); @@ -66,14 +72,13 @@ if (rs.special()) { small_page_write(rs.base(), size); } - - release_memory_for_test(rs); } static void test_reserved_size_alignment(size_t size, size_t alignment) { ASSERT_PRED2(is_size_alignment, size, alignment) << "Incorrect input parameters"; ReservedSpace rs(size, alignment, UseLargePages, (char *) NULL); + MemoryReleaser releaser(&rs); ASSERT_TRUE(rs.base() != NULL) << "rs.special = " << rs.special(); ASSERT_EQ(size, rs.size()) << "rs.special = " << rs.special(); @@ -86,8 +91,6 @@ if (rs.special()) { small_page_write(rs.base(), size); } - - release_memory_for_test(rs); } static void test_reserved_size_alignment_page_type(size_t size, size_t alignment, bool maybe_large) { @@ -103,6 +106,7 @@ bool large = maybe_large && UseLargePages && size >= os::large_page_size(); ReservedSpace rs(size, alignment, large, false); + MemoryReleaser releaser(&rs); EXPECT_TRUE(rs.base() != NULL) << "rs.special: " << rs.special(); EXPECT_EQ(size, rs.size()) << "rs.special: " << rs.special(); @@ -110,8 +114,6 @@ if (rs.special()) { small_page_write(rs.base(), size); } - - release_memory_for_test(rs); } } @@ -157,32 +159,37 @@ EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(ag * 4, ag * 4, false)); EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(ag * 8, ag * 4, false)); EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(ag * 16, ag * 4, false)); +} - if (UseLargePages) { - size_t lp = os::large_page_size(); - - // Without large pages - EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp, ag * 4, false)); - EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp * 2, ag * 4, false)); - EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp * 4, ag * 4, false)); - EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp, lp , false)); - EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp * 2, lp , false)); - EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp * 3, lp , false)); - EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp * 2, lp * 2, false)); - EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp * 4, lp * 2, false)); - EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp * 8, lp * 2, false)); - - // With large pages - EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp, ag * 4 , true)); - EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp * 2, ag * 4, true)); - EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp * 4, ag * 4, true)); - EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp, lp , true)); - EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp * 2, lp , true)); - EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp * 3, lp , true)); - EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp * 2, lp * 2, true)); - EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp * 4, lp * 2, true)); - EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp * 8, lp * 2, true)); +TEST_VM(ReservedSpace, size_alignment_page_type_large_page) { + if (!UseLargePages) { + return; } + + size_t ag = os::vm_allocation_granularity(); + size_t lp = os::large_page_size(); + + // Without large pages + EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp, ag * 4, false)); + EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp * 2, ag * 4, false)); + EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp * 4, ag * 4, false)); + EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp, lp , false)); + EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp * 2, lp , false)); + EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp * 3, lp , false)); + EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp * 2, lp * 2, false)); + EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp * 4, lp * 2, false)); + EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp * 8, lp * 2, false)); + + // With large pages + EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp, ag * 4 , true)); + EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp * 2, ag * 4, true)); + EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp * 4, ag * 4, true)); + EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp, lp , true)); + EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp * 2, lp , true)); + EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp * 3, lp , true)); + EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp * 2, lp * 2, true)); + EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp * 4, lp * 2, true)); + EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp * 8, lp * 2, true)); } namespace {