Index: test/cctest/heap/test-compaction.cc |
diff --git a/test/cctest/heap/test-compaction.cc b/test/cctest/heap/test-compaction.cc |
index b787780d25dd7bb8c7a3840d238a35b307882c31..f61f7e1c41b8cba310f0aa610402017b6df50630 100644 |
--- a/test/cctest/heap/test-compaction.cc |
+++ b/test/cctest/heap/test-compaction.cc |
@@ -4,12 +4,14 @@ |
#include "test/cctest/cctest.h" |
#include "test/cctest/heap/heap-tester.h" |
-#include "test/cctest/heap/utils-inl.h" |
+#include "test/cctest/heap/heap-utils.h" |
namespace v8 { |
namespace internal { |
-static void CheckInvariantsOfAbortedPage(Page* page) { |
+namespace { |
+ |
+void CheckInvariantsOfAbortedPage(Page* page) { |
// Check invariants: |
// 1) Markbits are cleared |
// 2) The page is not marked as evacuation candidate anymore |
@@ -19,6 +21,14 @@ static void CheckInvariantsOfAbortedPage(Page* page) { |
CHECK(!page->IsFlagSet(Page::COMPACTION_WAS_ABORTED)); |
} |
+void CheckAllObjectsOnPage(std::vector<Handle<FixedArray>>& handles, |
+ Page* page) { |
+ for (auto& fixed_array : handles) { |
+ CHECK(Page::FromAddress(fixed_array->address()) == page); |
+ } |
+} |
+ |
+} // namespace |
HEAP_TEST(CompactionFullAbortedPage) { |
// Test the scenario where we reach OOM during compaction and the whole page |
@@ -33,20 +43,19 @@ HEAP_TEST(CompactionFullAbortedPage) { |
Heap* heap = isolate->heap(); |
{ |
HandleScope scope1(isolate); |
- PageIterator it(heap->old_space()); |
- while (it.has_next()) { |
- it.next()->MarkNeverAllocateForTesting(); |
- } |
+ |
+ heap::SealCurrentObjects(heap); |
{ |
HandleScope scope2(isolate); |
CHECK(heap->old_space()->Expand()); |
auto compaction_page_handles = |
- CreatePadding(heap, Page::kAllocatableMemory, TENURED); |
+ heap::CreatePadding(heap, Page::kAllocatableMemory, TENURED); |
Page* to_be_aborted_page = |
Page::FromAddress(compaction_page_handles.front()->address()); |
to_be_aborted_page->SetFlag( |
MemoryChunk::FORCE_EVACUATION_CANDIDATE_FOR_TESTING); |
+ CheckAllObjectsOnPage(compaction_page_handles, to_be_aborted_page); |
heap->set_force_oom(true); |
heap->CollectAllGarbage(); |
@@ -72,29 +81,29 @@ HEAP_TEST(CompactionPartiallyAbortedPage) { |
FLAG_concurrent_sweeping = false; |
FLAG_manual_evacuation_candidates_selection = true; |
- const int object_size = 128 * KB; |
+ const int objects_per_page = 10; |
+ const int object_size = Page::kAllocatableMemory / objects_per_page; |
CcTest::InitializeVM(); |
Isolate* isolate = CcTest::i_isolate(); |
Heap* heap = isolate->heap(); |
{ |
HandleScope scope1(isolate); |
- PageIterator it(heap->old_space()); |
- while (it.has_next()) { |
- it.next()->MarkNeverAllocateForTesting(); |
- } |
+ |
+ heap::SealCurrentObjects(heap); |
{ |
HandleScope scope2(isolate); |
// Fill another page with objects of size {object_size} (last one is |
// properly adjusted). |
CHECK(heap->old_space()->Expand()); |
- auto compaction_page_handles = |
- CreatePadding(heap, Page::kAllocatableMemory, TENURED, object_size); |
+ auto compaction_page_handles = heap::CreatePadding( |
+ heap, Page::kAllocatableMemory, TENURED, object_size); |
Page* to_be_aborted_page = |
Page::FromAddress(compaction_page_handles.front()->address()); |
to_be_aborted_page->SetFlag( |
MemoryChunk::FORCE_EVACUATION_CANDIDATE_FOR_TESTING); |
+ CheckAllObjectsOnPage(compaction_page_handles, to_be_aborted_page); |
{ |
// Add another page that is filled with {num_objects} objects of size |
@@ -102,8 +111,9 @@ HEAP_TEST(CompactionPartiallyAbortedPage) { |
HandleScope scope3(isolate); |
CHECK(heap->old_space()->Expand()); |
const int num_objects = 3; |
- std::vector<Handle<FixedArray>> page_to_fill_handles = CreatePadding( |
- heap, object_size * num_objects, TENURED, object_size); |
+ std::vector<Handle<FixedArray>> page_to_fill_handles = |
+ heap::CreatePadding(heap, object_size * num_objects, TENURED, |
+ object_size); |
Page* page_to_fill = |
Page::FromAddress(page_to_fill_handles.front()->address()); |
@@ -145,7 +155,8 @@ HEAP_TEST(CompactionPartiallyAbortedPageIntraAbortedPointers) { |
FLAG_concurrent_sweeping = false; |
FLAG_manual_evacuation_candidates_selection = true; |
- const int object_size = 128 * KB; |
+ const int objects_per_page = 10; |
+ const int object_size = Page::kAllocatableMemory / objects_per_page; |
CcTest::InitializeVM(); |
Isolate* isolate = CcTest::i_isolate(); |
@@ -155,10 +166,7 @@ HEAP_TEST(CompactionPartiallyAbortedPageIntraAbortedPointers) { |
Handle<FixedArray> root_array = |
isolate->factory()->NewFixedArray(10, TENURED); |
- PageIterator it(heap->old_space()); |
- while (it.has_next()) { |
- it.next()->MarkNeverAllocateForTesting(); |
- } |
+ heap::SealCurrentObjects(heap); |
Page* to_be_aborted_page = nullptr; |
{ |
@@ -167,7 +175,8 @@ HEAP_TEST(CompactionPartiallyAbortedPageIntraAbortedPointers) { |
// properly adjusted). |
CHECK(heap->old_space()->Expand()); |
std::vector<Handle<FixedArray>> compaction_page_handles = |
- CreatePadding(heap, Page::kAllocatableMemory, TENURED, object_size); |
+ heap::CreatePadding(heap, Page::kAllocatableMemory, TENURED, |
+ object_size); |
to_be_aborted_page = |
Page::FromAddress(compaction_page_handles.front()->address()); |
to_be_aborted_page->SetFlag( |
@@ -176,8 +185,8 @@ HEAP_TEST(CompactionPartiallyAbortedPageIntraAbortedPointers) { |
compaction_page_handles[i]->set(0, *compaction_page_handles[i - 1]); |
} |
root_array->set(0, *compaction_page_handles.back()); |
+ CheckAllObjectsOnPage(compaction_page_handles, to_be_aborted_page); |
} |
- |
{ |
// Add another page that is filled with {num_objects} objects of size |
// {object_size}. |
@@ -186,7 +195,7 @@ HEAP_TEST(CompactionPartiallyAbortedPageIntraAbortedPointers) { |
const int num_objects = 2; |
int used_memory = object_size * num_objects; |
std::vector<Handle<FixedArray>> page_to_fill_handles = |
- CreatePadding(heap, used_memory, TENURED, object_size); |
+ heap::CreatePadding(heap, used_memory, TENURED, object_size); |
Page* page_to_fill = |
Page::FromAddress(page_to_fill_handles.front()->address()); |
@@ -233,7 +242,8 @@ HEAP_TEST(CompactionPartiallyAbortedPageWithStoreBufferEntries) { |
FLAG_concurrent_sweeping = false; |
FLAG_manual_evacuation_candidates_selection = true; |
- const int object_size = 128 * KB; |
+ const int objects_per_page = 10; |
+ const int object_size = Page::kAllocatableMemory / objects_per_page; |
CcTest::InitializeVM(); |
Isolate* isolate = CcTest::i_isolate(); |
@@ -242,10 +252,7 @@ HEAP_TEST(CompactionPartiallyAbortedPageWithStoreBufferEntries) { |
HandleScope scope1(isolate); |
Handle<FixedArray> root_array = |
isolate->factory()->NewFixedArray(10, TENURED); |
- PageIterator it(heap->old_space()); |
- while (it.has_next()) { |
- it.next()->MarkNeverAllocateForTesting(); |
- } |
+ heap::SealCurrentObjects(heap); |
Page* to_be_aborted_page = nullptr; |
{ |
@@ -253,8 +260,8 @@ HEAP_TEST(CompactionPartiallyAbortedPageWithStoreBufferEntries) { |
// Fill another page with objects of size {object_size} (last one is |
// properly adjusted). |
CHECK(heap->old_space()->Expand()); |
- auto compaction_page_handles = |
- CreatePadding(heap, Page::kAllocatableMemory, TENURED, object_size); |
+ auto compaction_page_handles = heap::CreatePadding( |
+ heap, Page::kAllocatableMemory, TENURED, object_size); |
// Sanity check that we have enough space for linking up arrays. |
CHECK_GE(compaction_page_handles.front()->length(), 2); |
to_be_aborted_page = |
@@ -270,6 +277,7 @@ HEAP_TEST(CompactionPartiallyAbortedPageWithStoreBufferEntries) { |
isolate->factory()->NewFixedArray(1, NOT_TENURED); |
CHECK(heap->InNewSpace(*new_space_array)); |
compaction_page_handles.front()->set(1, *new_space_array); |
+ CheckAllObjectsOnPage(compaction_page_handles, to_be_aborted_page); |
} |
{ |
@@ -280,7 +288,7 @@ HEAP_TEST(CompactionPartiallyAbortedPageWithStoreBufferEntries) { |
const int num_objects = 2; |
int used_memory = object_size * num_objects; |
std::vector<Handle<FixedArray>> page_to_fill_handles = |
- CreatePadding(heap, used_memory, TENURED, object_size); |
+ heap::CreatePadding(heap, used_memory, TENURED, object_size); |
Page* page_to_fill = |
Page::FromAddress(page_to_fill_handles.front()->address()); |