| OLD | NEW |
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/factory.h" | 5 #include "src/factory.h" |
| 6 #include "src/heap/mark-compact.h" | 6 #include "src/heap/mark-compact.h" |
| 7 #include "src/isolate.h" | 7 #include "src/isolate.h" |
| 8 // FIXME(mstarzinger, marja): This is weird, but required because of the missing | 8 // FIXME(mstarzinger, marja): This is weird, but required because of the missing |
| 9 // (disallowed) include: src/factory.h -> src/objects-inl.h | 9 // (disallowed) include: src/factory.h -> src/objects-inl.h |
| 10 #include "src/objects-inl.h" | 10 #include "src/objects-inl.h" |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 61 CHECK(heap->old_space()->Expand()); | 61 CHECK(heap->old_space()->Expand()); |
| 62 auto compaction_page_handles = | 62 auto compaction_page_handles = |
| 63 heap::CreatePadding(heap, Page::kAllocatableMemory, TENURED); | 63 heap::CreatePadding(heap, Page::kAllocatableMemory, TENURED); |
| 64 Page* to_be_aborted_page = | 64 Page* to_be_aborted_page = |
| 65 Page::FromAddress(compaction_page_handles.front()->address()); | 65 Page::FromAddress(compaction_page_handles.front()->address()); |
| 66 to_be_aborted_page->SetFlag( | 66 to_be_aborted_page->SetFlag( |
| 67 MemoryChunk::FORCE_EVACUATION_CANDIDATE_FOR_TESTING); | 67 MemoryChunk::FORCE_EVACUATION_CANDIDATE_FOR_TESTING); |
| 68 CheckAllObjectsOnPage(compaction_page_handles, to_be_aborted_page); | 68 CheckAllObjectsOnPage(compaction_page_handles, to_be_aborted_page); |
| 69 | 69 |
| 70 heap->set_force_oom(true); | 70 heap->set_force_oom(true); |
| 71 heap->CollectAllGarbage(); | 71 CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| 72 heap->mark_compact_collector()->EnsureSweepingCompleted(); | 72 heap->mark_compact_collector()->EnsureSweepingCompleted(); |
| 73 | 73 |
| 74 // Check that all handles still point to the same page, i.e., compaction | 74 // Check that all handles still point to the same page, i.e., compaction |
| 75 // has been aborted on the page. | 75 // has been aborted on the page. |
| 76 for (Handle<FixedArray> object : compaction_page_handles) { | 76 for (Handle<FixedArray> object : compaction_page_handles) { |
| 77 CHECK_EQ(to_be_aborted_page, Page::FromAddress(object->address())); | 77 CHECK_EQ(to_be_aborted_page, Page::FromAddress(object->address())); |
| 78 } | 78 } |
| 79 CheckInvariantsOfAbortedPage(to_be_aborted_page); | 79 CheckInvariantsOfAbortedPage(to_be_aborted_page); |
| 80 } | 80 } |
| 81 } | 81 } |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 121 HandleScope scope3(isolate); | 121 HandleScope scope3(isolate); |
| 122 CHECK(heap->old_space()->Expand()); | 122 CHECK(heap->old_space()->Expand()); |
| 123 const int num_objects = 3; | 123 const int num_objects = 3; |
| 124 std::vector<Handle<FixedArray>> page_to_fill_handles = | 124 std::vector<Handle<FixedArray>> page_to_fill_handles = |
| 125 heap::CreatePadding(heap, object_size * num_objects, TENURED, | 125 heap::CreatePadding(heap, object_size * num_objects, TENURED, |
| 126 object_size); | 126 object_size); |
| 127 Page* page_to_fill = | 127 Page* page_to_fill = |
| 128 Page::FromAddress(page_to_fill_handles.front()->address()); | 128 Page::FromAddress(page_to_fill_handles.front()->address()); |
| 129 | 129 |
| 130 heap->set_force_oom(true); | 130 heap->set_force_oom(true); |
| 131 heap->CollectAllGarbage(); | 131 CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| 132 heap->mark_compact_collector()->EnsureSweepingCompleted(); | 132 heap->mark_compact_collector()->EnsureSweepingCompleted(); |
| 133 | 133 |
| 134 bool migration_aborted = false; | 134 bool migration_aborted = false; |
| 135 for (Handle<FixedArray> object : compaction_page_handles) { | 135 for (Handle<FixedArray> object : compaction_page_handles) { |
| 136 // Once compaction has been aborted, all following objects still have | 136 // Once compaction has been aborted, all following objects still have |
| 137 // to be on the initial page. | 137 // to be on the initial page. |
| 138 CHECK(!migration_aborted || | 138 CHECK(!migration_aborted || |
| 139 (Page::FromAddress(object->address()) == to_be_aborted_page)); | 139 (Page::FromAddress(object->address()) == to_be_aborted_page)); |
| 140 if (Page::FromAddress(object->address()) == to_be_aborted_page) { | 140 if (Page::FromAddress(object->address()) == to_be_aborted_page) { |
| 141 // This object has not been migrated. | 141 // This object has not been migrated. |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 203 HandleScope scope3(isolate); | 203 HandleScope scope3(isolate); |
| 204 CHECK(heap->old_space()->Expand()); | 204 CHECK(heap->old_space()->Expand()); |
| 205 const int num_objects = 2; | 205 const int num_objects = 2; |
| 206 int used_memory = object_size * num_objects; | 206 int used_memory = object_size * num_objects; |
| 207 std::vector<Handle<FixedArray>> page_to_fill_handles = | 207 std::vector<Handle<FixedArray>> page_to_fill_handles = |
| 208 heap::CreatePadding(heap, used_memory, TENURED, object_size); | 208 heap::CreatePadding(heap, used_memory, TENURED, object_size); |
| 209 Page* page_to_fill = | 209 Page* page_to_fill = |
| 210 Page::FromAddress(page_to_fill_handles.front()->address()); | 210 Page::FromAddress(page_to_fill_handles.front()->address()); |
| 211 | 211 |
| 212 heap->set_force_oom(true); | 212 heap->set_force_oom(true); |
| 213 heap->CollectAllGarbage(); | 213 CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| 214 heap->mark_compact_collector()->EnsureSweepingCompleted(); | 214 heap->mark_compact_collector()->EnsureSweepingCompleted(); |
| 215 | 215 |
| 216 // The following check makes sure that we compacted "some" objects, while | 216 // The following check makes sure that we compacted "some" objects, while |
| 217 // leaving others in place. | 217 // leaving others in place. |
| 218 bool in_place = true; | 218 bool in_place = true; |
| 219 Handle<FixedArray> current = root_array; | 219 Handle<FixedArray> current = root_array; |
| 220 while (current->get(0) != heap->undefined_value()) { | 220 while (current->get(0) != heap->undefined_value()) { |
| 221 current = Handle<FixedArray>(FixedArray::cast(current->get(0))); | 221 current = Handle<FixedArray>(FixedArray::cast(current->get(0))); |
| 222 CHECK(current->IsFixedArray()); | 222 CHECK(current->IsFixedArray()); |
| 223 if (Page::FromAddress(current->address()) != to_be_aborted_page) { | 223 if (Page::FromAddress(current->address()) != to_be_aborted_page) { |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 296 HandleScope scope3(isolate); | 296 HandleScope scope3(isolate); |
| 297 CHECK(heap->old_space()->Expand()); | 297 CHECK(heap->old_space()->Expand()); |
| 298 const int num_objects = 2; | 298 const int num_objects = 2; |
| 299 int used_memory = object_size * num_objects; | 299 int used_memory = object_size * num_objects; |
| 300 std::vector<Handle<FixedArray>> page_to_fill_handles = | 300 std::vector<Handle<FixedArray>> page_to_fill_handles = |
| 301 heap::CreatePadding(heap, used_memory, TENURED, object_size); | 301 heap::CreatePadding(heap, used_memory, TENURED, object_size); |
| 302 Page* page_to_fill = | 302 Page* page_to_fill = |
| 303 Page::FromAddress(page_to_fill_handles.front()->address()); | 303 Page::FromAddress(page_to_fill_handles.front()->address()); |
| 304 | 304 |
| 305 heap->set_force_oom(true); | 305 heap->set_force_oom(true); |
| 306 heap->CollectAllGarbage(); | 306 CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| 307 heap->mark_compact_collector()->EnsureSweepingCompleted(); | 307 heap->mark_compact_collector()->EnsureSweepingCompleted(); |
| 308 | 308 |
| 309 // The following check makes sure that we compacted "some" objects, while | 309 // The following check makes sure that we compacted "some" objects, while |
| 310 // leaving others in place. | 310 // leaving others in place. |
| 311 bool in_place = true; | 311 bool in_place = true; |
| 312 Handle<FixedArray> current = root_array; | 312 Handle<FixedArray> current = root_array; |
| 313 while (current->get(0) != heap->undefined_value()) { | 313 while (current->get(0) != heap->undefined_value()) { |
| 314 current = Handle<FixedArray>(FixedArray::cast(current->get(0))); | 314 current = Handle<FixedArray>(FixedArray::cast(current->get(0))); |
| 315 CHECK(!heap->InNewSpace(*current)); | 315 CHECK(!heap->InNewSpace(*current)); |
| 316 CHECK(current->IsFixedArray()); | 316 CHECK(current->IsFixedArray()); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 346 // the first word in the string. Since the first object definitely | 346 // the first word in the string. Since the first object definitely |
| 347 // migrated we can just allocate until we hit the aborted page. | 347 // migrated we can just allocate until we hit the aborted page. |
| 348 string = isolate->factory() | 348 string = isolate->factory() |
| 349 ->NewStringFromOneByte(string_to_broken_addresss, TENURED) | 349 ->NewStringFromOneByte(string_to_broken_addresss, TENURED) |
| 350 .ToHandleChecked(); | 350 .ToHandleChecked(); |
| 351 } while (Page::FromAddress(string->address()) != to_be_aborted_page); | 351 } while (Page::FromAddress(string->address()) != to_be_aborted_page); |
| 352 | 352 |
| 353 // If store buffer entries are not properly filtered/reset for aborted | 353 // If store buffer entries are not properly filtered/reset for aborted |
| 354 // pages we have now a broken address at an object slot in old space and | 354 // pages we have now a broken address at an object slot in old space and |
| 355 // the following scavenge will crash. | 355 // the following scavenge will crash. |
| 356 heap->CollectGarbage(NEW_SPACE); | 356 CcTest::CollectGarbage(NEW_SPACE); |
| 357 } | 357 } |
| 358 } | 358 } |
| 359 } | 359 } |
| 360 | 360 |
| 361 } // namespace internal | 361 } // namespace internal |
| 362 } // namespace v8 | 362 } // namespace v8 |
| OLD | NEW |