8266807: Windows os_windows-gtest broken for UseLargePages

Reviewed-by: iwalulya, ayang, tschatzl
This commit is contained in:
Stefan Johansson 2021-05-31 12:51:21 +00:00
parent ce44cd6881
commit 5df25dc088

View File

@ -25,6 +25,7 @@
#ifdef _WINDOWS #ifdef _WINDOWS
#include "logging/log.hpp"
#include "runtime/os.hpp" #include "runtime/os.hpp"
#include "runtime/flags/flagSetting.hpp" #include "runtime/flags/flagSetting.hpp"
#include "runtime/globals_extension.hpp" #include "runtime/globals_extension.hpp"
@ -38,8 +39,10 @@ namespace {
public: public:
MemoryReleaser(char* ptr, size_t size) : _ptr(ptr), _size(size) { } MemoryReleaser(char* ptr, size_t size) : _ptr(ptr), _size(size) { }
~MemoryReleaser() { ~MemoryReleaser() {
if (_ptr != NULL) {
os::release_memory_special(_ptr, _size); os::release_memory_special(_ptr, _size);
} }
}
}; };
} }
@ -65,25 +68,32 @@ void TestReserveMemorySpecial_test() {
const size_t large_allocation_size = os::large_page_size() * 4; const size_t large_allocation_size = os::large_page_size() * 4;
char* result = os::reserve_memory_special(large_allocation_size, os::large_page_size(), os::large_page_size(), NULL, false); char* result = os::reserve_memory_special(large_allocation_size, os::large_page_size(), os::large_page_size(), NULL, false);
if (result != NULL) { if (result == NULL) {
// failed to allocate memory, skipping the test // failed to allocate memory, skipping the test
return; return;
} }
MemoryReleaser mr(result, large_allocation_size); MemoryReleaser m1(result, large_allocation_size);
// allocate another page within the recently allocated memory area which seems to be a good location. At least // Reserve another page within the recently allocated memory area. This should fail
// we managed to get it once.
const size_t expected_allocation_size = os::large_page_size(); const size_t expected_allocation_size = os::large_page_size();
char* expected_location = result + os::large_page_size(); char* expected_location = result + os::large_page_size();
char* actual_location = os::reserve_memory_special(expected_allocation_size, os::large_page_size(), os::large_page_size(), expected_location, false); char* actual_location = os::reserve_memory_special(expected_allocation_size, os::large_page_size(), os::large_page_size(), expected_location, false);
if (actual_location != NULL) { EXPECT_TRUE(actual_location == NULL) << "Should not be allowed to reserve within present reservation";
// failed to allocate memory, skipping the test
return;
}
MemoryReleaser mr2(actual_location, expected_allocation_size);
EXPECT_EQ(expected_location, actual_location) // Instead try reserving after the first reservation.
<< "Failed to allocate memory at requested location " << expected_location << " of size " << expected_allocation_size; expected_location = result + large_allocation_size;
actual_location = os::reserve_memory_special(expected_allocation_size, os::large_page_size(), os::large_page_size(), expected_location, false);
EXPECT_TRUE(actual_location != NULL) << "Unexpected reservation failure, cant verify correct location";
EXPECT_TRUE(actual_location == expected_location) << "Reservation must be at requested location";
MemoryReleaser m2(actual_location, os::large_page_size());
// Now try to do a reservation with a larger alignment.
const size_t alignment = os::large_page_size() * 2;
const size_t new_large_size = alignment * 4;
char* aligned_request = os::reserve_memory_special(new_large_size, alignment, os::large_page_size(), NULL, false);
EXPECT_TRUE(aligned_request != NULL) << "Unexpected reservation failure, cant verify correct alignment";
EXPECT_TRUE(is_aligned(aligned_request, alignment)) << "Returned address must be aligned";
MemoryReleaser m3(aligned_request, new_large_size);
} }
// The types of path modifications we randomly apply to a path. They should not change the file designated by the path. // The types of path modifications we randomly apply to a path. They should not change the file designated by the path.