| OLD | NEW |
| 1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 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/array-buffer-tracker.h" | 6 #include "src/heap/array-buffer-tracker.h" |
| 7 #include "src/heap/spaces-inl.h" | 7 #include "src/heap/spaces-inl.h" |
| 8 #include "src/isolate.h" | 8 #include "src/isolate.h" |
| 9 // FIXME(mstarzinger, marja): This is weird, but required because of the missing | 9 // FIXME(mstarzinger, marja): This is weird, but required because of the missing |
| 10 // (disallowed) include: src/factory.h -> src/objects-inl.h | 10 // (disallowed) include: src/factory.h -> src/objects-inl.h |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 50 { | 50 { |
| 51 v8::Isolate::Scope isolate_scope(isolate); | 51 v8::Isolate::Scope isolate_scope(isolate); |
| 52 v8::HandleScope handle_scope(isolate); | 52 v8::HandleScope handle_scope(isolate); |
| 53 v8::Context::New(isolate)->Enter(); | 53 v8::Context::New(isolate)->Enter(); |
| 54 Heap* heap = i_isolate->heap(); | 54 Heap* heap = i_isolate->heap(); |
| 55 | 55 |
| 56 std::vector<Handle<FixedArray>> handles; | 56 std::vector<Handle<FixedArray>> handles; |
| 57 heap::SimulateFullSpace(heap->new_space(), &handles); | 57 heap::SimulateFullSpace(heap->new_space(), &handles); |
| 58 heap->CollectGarbage(NEW_SPACE, i::GarbageCollectionReason::kTesting); | 58 heap->CollectGarbage(NEW_SPACE, i::GarbageCollectionReason::kTesting); |
| 59 CHECK_GT(handles.size(), 0u); | 59 CHECK_GT(handles.size(), 0u); |
| 60 // First object in handle should be on the first page. | 60 // Last object in handles should definitely be on a page that does not |
| 61 Handle<FixedArray> first_object = handles.front(); | 61 // contain the age mark, thus qualifying for moving. |
| 62 Page* first_page = Page::FromAddress(first_object->address()); | 62 Handle<FixedArray> last_object = handles.back(); |
| 63 Page* to_be_promoted_page = Page::FromAddress(last_object->address()); |
| 64 CHECK(!to_be_promoted_page->Contains(heap->new_space()->age_mark())); |
| 63 // To perform a sanity check on live bytes we need to mark the heap. | 65 // To perform a sanity check on live bytes we need to mark the heap. |
| 64 heap::SimulateIncrementalMarking(heap, true); | 66 heap::SimulateIncrementalMarking(heap, true); |
| 65 // Sanity check that the page meets the requirements for promotion. | 67 // Sanity check that the page meets the requirements for promotion. |
| 66 const int threshold_bytes = | 68 const int threshold_bytes = |
| 67 FLAG_page_promotion_threshold * Page::kAllocatableMemory / 100; | 69 FLAG_page_promotion_threshold * Page::kAllocatableMemory / 100; |
| 68 CHECK_GE(MarkingState::Internal(first_page).live_bytes(), threshold_bytes); | 70 CHECK_GE(MarkingState::Internal(to_be_promoted_page).live_bytes(), |
| 71 threshold_bytes); |
| 69 | 72 |
| 70 // Actual checks: The page is in new space first, but is moved to old space | 73 // Actual checks: The page is in new space first, but is moved to old space |
| 71 // during a full GC. | 74 // during a full GC. |
| 72 CHECK(heap->new_space()->ContainsSlow(first_page->address())); | 75 CHECK(heap->new_space()->ContainsSlow(to_be_promoted_page->address())); |
| 73 CHECK(!heap->old_space()->ContainsSlow(first_page->address())); | 76 CHECK(!heap->old_space()->ContainsSlow(to_be_promoted_page->address())); |
| 74 heap::GcAndSweep(heap, OLD_SPACE); | 77 heap::GcAndSweep(heap, OLD_SPACE); |
| 75 CHECK(!heap->new_space()->ContainsSlow(first_page->address())); | 78 CHECK(!heap->new_space()->ContainsSlow(to_be_promoted_page->address())); |
| 76 CHECK(heap->old_space()->ContainsSlow(first_page->address())); | 79 CHECK(heap->old_space()->ContainsSlow(to_be_promoted_page->address())); |
| 77 } | 80 } |
| 78 } | 81 } |
| 79 | 82 |
| 80 UNINITIALIZED_TEST(PagePromotion_NewToNew) { | 83 UNINITIALIZED_TEST(PagePromotion_NewToNew) { |
| 81 if (!i::FLAG_page_promotion) return; | 84 if (!i::FLAG_page_promotion) return; |
| 82 | 85 |
| 83 v8::Isolate* isolate = NewIsolateForPagePromotion(); | 86 v8::Isolate* isolate = NewIsolateForPagePromotion(); |
| 84 Isolate* i_isolate = reinterpret_cast<Isolate*>(isolate); | 87 Isolate* i_isolate = reinterpret_cast<Isolate*>(isolate); |
| 85 { | 88 { |
| 86 v8::Isolate::Scope isolate_scope(isolate); | 89 v8::Isolate::Scope isolate_scope(isolate); |
| 87 v8::HandleScope handle_scope(isolate); | 90 v8::HandleScope handle_scope(isolate); |
| 88 v8::Context::New(isolate)->Enter(); | 91 v8::Context::New(isolate)->Enter(); |
| 89 Heap* heap = i_isolate->heap(); | 92 Heap* heap = i_isolate->heap(); |
| 90 | 93 |
| 91 std::vector<Handle<FixedArray>> handles; | 94 std::vector<Handle<FixedArray>> handles; |
| 92 heap::SimulateFullSpace(heap->new_space(), &handles); | 95 heap::SimulateFullSpace(heap->new_space(), &handles); |
| 93 CHECK_GT(handles.size(), 0u); | 96 CHECK_GT(handles.size(), 0u); |
| 94 // Last object in handles should definitely be on the last page which does | 97 // Last object in handles should definitely be on a page that does not |
| 95 // not contain the age mark. | 98 // contain the age mark, thus qualifying for moving. |
| 96 Handle<FixedArray> last_object = handles.back(); | 99 Handle<FixedArray> last_object = handles.back(); |
| 97 Page* to_be_promoted_page = Page::FromAddress(last_object->address()); | 100 Page* to_be_promoted_page = Page::FromAddress(last_object->address()); |
| 101 CHECK(!to_be_promoted_page->Contains(heap->new_space()->age_mark())); |
| 98 CHECK(to_be_promoted_page->Contains(last_object->address())); | 102 CHECK(to_be_promoted_page->Contains(last_object->address())); |
| 99 CHECK(heap->new_space()->ToSpaceContainsSlow(last_object->address())); | 103 CHECK(heap->new_space()->ToSpaceContainsSlow(last_object->address())); |
| 100 heap::GcAndSweep(heap, OLD_SPACE); | 104 heap::GcAndSweep(heap, OLD_SPACE); |
| 101 CHECK(heap->new_space()->ToSpaceContainsSlow(last_object->address())); | 105 CHECK(heap->new_space()->ToSpaceContainsSlow(last_object->address())); |
| 102 CHECK(to_be_promoted_page->Contains(last_object->address())); | 106 CHECK(to_be_promoted_page->Contains(last_object->address())); |
| 103 } | 107 } |
| 104 } | 108 } |
| 105 | 109 |
| 106 UNINITIALIZED_TEST(PagePromotion_NewToNewJSArrayBuffer) { | 110 UNINITIALIZED_TEST(PagePromotion_NewToNewJSArrayBuffer) { |
| 107 if (!i::FLAG_page_promotion) return; | 111 if (!i::FLAG_page_promotion) return; |
| (...skipping 11 matching lines...) Expand all Loading... |
| 119 // Fill the current page which potentially contains the age mark. | 123 // Fill the current page which potentially contains the age mark. |
| 120 heap::FillCurrentPage(heap->new_space()); | 124 heap::FillCurrentPage(heap->new_space()); |
| 121 // Allocate a buffer we would like to check against. | 125 // Allocate a buffer we would like to check against. |
| 122 Handle<JSArrayBuffer> buffer = | 126 Handle<JSArrayBuffer> buffer = |
| 123 i_isolate->factory()->NewJSArrayBuffer(SharedFlag::kNotShared); | 127 i_isolate->factory()->NewJSArrayBuffer(SharedFlag::kNotShared); |
| 124 CHECK(JSArrayBuffer::SetupAllocatingData(buffer, i_isolate, 100)); | 128 CHECK(JSArrayBuffer::SetupAllocatingData(buffer, i_isolate, 100)); |
| 125 std::vector<Handle<FixedArray>> handles; | 129 std::vector<Handle<FixedArray>> handles; |
| 126 // Simulate a full space, filling the interesting page with live objects. | 130 // Simulate a full space, filling the interesting page with live objects. |
| 127 heap::SimulateFullSpace(heap->new_space(), &handles); | 131 heap::SimulateFullSpace(heap->new_space(), &handles); |
| 128 CHECK_GT(handles.size(), 0u); | 132 CHECK_GT(handles.size(), 0u); |
| 129 // Last object in handles should definitely be on the last page which does | 133 // First object in handles should be on the same page as the allocated |
| 130 // not contain the age mark. | 134 // JSArrayBuffer. |
| 131 Handle<FixedArray> first_object = handles.front(); | 135 Handle<FixedArray> first_object = handles.front(); |
| 132 Page* to_be_promoted_page = Page::FromAddress(first_object->address()); | 136 Page* to_be_promoted_page = Page::FromAddress(first_object->address()); |
| 137 CHECK(!to_be_promoted_page->Contains(heap->new_space()->age_mark())); |
| 133 CHECK(to_be_promoted_page->Contains(first_object->address())); | 138 CHECK(to_be_promoted_page->Contains(first_object->address())); |
| 134 CHECK(to_be_promoted_page->Contains(buffer->address())); | 139 CHECK(to_be_promoted_page->Contains(buffer->address())); |
| 135 CHECK(heap->new_space()->ToSpaceContainsSlow(first_object->address())); | 140 CHECK(heap->new_space()->ToSpaceContainsSlow(first_object->address())); |
| 136 CHECK(heap->new_space()->ToSpaceContainsSlow(buffer->address())); | 141 CHECK(heap->new_space()->ToSpaceContainsSlow(buffer->address())); |
| 137 heap::GcAndSweep(heap, OLD_SPACE); | 142 heap::GcAndSweep(heap, OLD_SPACE); |
| 138 CHECK(heap->new_space()->ToSpaceContainsSlow(first_object->address())); | 143 CHECK(heap->new_space()->ToSpaceContainsSlow(first_object->address())); |
| 139 CHECK(heap->new_space()->ToSpaceContainsSlow(buffer->address())); | 144 CHECK(heap->new_space()->ToSpaceContainsSlow(buffer->address())); |
| 140 CHECK(to_be_promoted_page->Contains(first_object->address())); | 145 CHECK(to_be_promoted_page->Contains(first_object->address())); |
| 141 CHECK(to_be_promoted_page->Contains(buffer->address())); | 146 CHECK(to_be_promoted_page->Contains(buffer->address())); |
| 142 CHECK(ArrayBufferTracker::IsTracked(*buffer)); | 147 CHECK(ArrayBufferTracker::IsTracked(*buffer)); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 153 v8::HandleScope handle_scope(isolate); | 158 v8::HandleScope handle_scope(isolate); |
| 154 v8::Context::New(isolate)->Enter(); | 159 v8::Context::New(isolate)->Enter(); |
| 155 Heap* heap = i_isolate->heap(); | 160 Heap* heap = i_isolate->heap(); |
| 156 heap->delay_sweeper_tasks_for_testing_ = true; | 161 heap->delay_sweeper_tasks_for_testing_ = true; |
| 157 heap->new_space()->Grow(); | 162 heap->new_space()->Grow(); |
| 158 { | 163 { |
| 159 v8::HandleScope inner_handle_scope(isolate); | 164 v8::HandleScope inner_handle_scope(isolate); |
| 160 std::vector<Handle<FixedArray>> handles; | 165 std::vector<Handle<FixedArray>> handles; |
| 161 heap::SimulateFullSpace(heap->new_space(), &handles); | 166 heap::SimulateFullSpace(heap->new_space(), &handles); |
| 162 CHECK_GT(handles.size(), 0u); | 167 CHECK_GT(handles.size(), 0u); |
| 163 // Last object in handles should definitely be on the last page which does | 168 // Last object in handles should definitely be on a page that does not |
| 164 // not contain the age mark. | 169 // contain the age mark, thus qualifying for moving. |
| 165 Handle<FixedArray> last_object = handles.back(); | 170 Handle<FixedArray> last_object = handles.back(); |
| 166 Page* to_be_promoted_page = Page::FromAddress(last_object->address()); | 171 Page* to_be_promoted_page = Page::FromAddress(last_object->address()); |
| 172 CHECK(!to_be_promoted_page->Contains(heap->new_space()->age_mark())); |
| 167 CHECK(to_be_promoted_page->Contains(last_object->address())); | 173 CHECK(to_be_promoted_page->Contains(last_object->address())); |
| 168 CHECK(heap->new_space()->ToSpaceContainsSlow(last_object->address())); | 174 CHECK(heap->new_space()->ToSpaceContainsSlow(last_object->address())); |
| 169 heap->CollectGarbage(OLD_SPACE, i::GarbageCollectionReason::kTesting); | 175 heap->CollectGarbage(OLD_SPACE, i::GarbageCollectionReason::kTesting); |
| 170 CHECK(heap->new_space()->ToSpaceContainsSlow(last_object->address())); | 176 CHECK(heap->new_space()->ToSpaceContainsSlow(last_object->address())); |
| 171 CHECK(to_be_promoted_page->Contains(last_object->address())); | 177 CHECK(to_be_promoted_page->Contains(last_object->address())); |
| 172 } | 178 } |
| 173 heap->CollectGarbage(NEW_SPACE, i::GarbageCollectionReason::kTesting); | 179 heap->CollectGarbage(NEW_SPACE, i::GarbageCollectionReason::kTesting); |
| 174 heap->new_space()->Shrink(); | 180 heap->new_space()->Shrink(); |
| 175 heap->memory_allocator()->unmapper()->WaitUntilCompleted(); | 181 heap->memory_allocator()->unmapper()->WaitUntilCompleted(); |
| 176 heap->mark_compact_collector()->sweeper().StartSweeperTasks(); | 182 heap->mark_compact_collector()->sweeper().StartSweeperTasks(); |
| 177 heap->mark_compact_collector()->EnsureSweepingCompleted(); | 183 heap->mark_compact_collector()->EnsureSweepingCompleted(); |
| 178 } | 184 } |
| 179 } | 185 } |
| 180 | 186 |
| 181 } // namespace internal | 187 } // namespace internal |
| 182 } // namespace v8 | 188 } // namespace v8 |
| OLD | NEW |