OLD | NEW |
---|---|
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #include "src/base/atomicops.h" | 7 #include "src/base/atomicops.h" |
8 #include "src/code-stubs.h" | 8 #include "src/code-stubs.h" |
9 #include "src/compilation-cache.h" | 9 #include "src/compilation-cache.h" |
10 #include "src/cpu-profiler.h" | 10 #include "src/cpu-profiler.h" |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
105 } | 105 } |
106 } | 106 } |
107 | 107 |
108 | 108 |
109 static void VerifyMarking(NewSpace* space) { | 109 static void VerifyMarking(NewSpace* space) { |
110 Address end = space->top(); | 110 Address end = space->top(); |
111 NewSpacePageIterator it(space->bottom(), end); | 111 NewSpacePageIterator it(space->bottom(), end); |
112 // The bottom position is at the start of its page. Allows us to use | 112 // The bottom position is at the start of its page. Allows us to use |
113 // page->area_start() as start of range on all pages. | 113 // page->area_start() as start of range on all pages. |
114 CHECK_EQ(space->bottom(), | 114 CHECK_EQ(space->bottom(), |
115 NewSpacePage::FromAddress(space->bottom())->area_start()); | 115 NewSpacePage::FromAddress(space->bottom())->area_start()); |
116 while (it.has_next()) { | 116 while (it.has_next()) { |
117 NewSpacePage* page = it.next(); | 117 NewSpacePage* page = it.next(); |
118 Address limit = it.has_next() ? page->area_end() : end; | 118 Address limit = it.has_next() ? page->area_end() : end; |
119 CHECK(limit == end || !page->Contains(end)); | 119 CHECK(limit == end || !page->Contains(end)); |
120 VerifyMarking(space->heap(), page->area_start(), limit); | 120 VerifyMarking(space->heap(), page->area_start(), limit); |
121 } | 121 } |
122 } | 122 } |
123 | 123 |
124 | 124 |
125 static void VerifyMarking(PagedSpace* space) { | 125 static void VerifyMarking(PagedSpace* space) { |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
160 for (Object** current = start; current < end; current++) { | 160 for (Object** current = start; current < end; current++) { |
161 if ((*current)->IsHeapObject()) { | 161 if ((*current)->IsHeapObject()) { |
162 HeapObject* object = HeapObject::cast(*current); | 162 HeapObject* object = HeapObject::cast(*current); |
163 CHECK(!MarkCompactCollector::IsOnEvacuationCandidate(object)); | 163 CHECK(!MarkCompactCollector::IsOnEvacuationCandidate(object)); |
164 } | 164 } |
165 } | 165 } |
166 } | 166 } |
167 }; | 167 }; |
168 | 168 |
169 | 169 |
170 static void VerifyEvacuation(Address bottom, Address top) { | 170 static void VerifyEvacuation(Page* page) { |
171 VerifyEvacuationVisitor visitor; | 171 VerifyEvacuationVisitor visitor; |
172 HeapObject* object; | 172 HeapObjectIterator iterator(page, NULL); |
173 Address next_object_must_be_here_or_later = bottom; | 173 for (HeapObject* heap_object = iterator.Next(); heap_object != NULL; |
174 | 174 heap_object = iterator.Next()) { |
Michael Starzinger
2014/07/21 14:58:55
nit: Indentation looks off.
Hannes Payer (out of office)
2014/07/21 15:11:42
nope, 4 spaces
| |
175 for (Address current = bottom; | 175 // We skip free space objects. |
176 current < top; | 176 if (!heap_object->IsFiller()) { |
177 current += kPointerSize) { | 177 heap_object->Iterate(&visitor); |
178 object = HeapObject::FromAddress(current); | |
179 if (MarkCompactCollector::IsMarked(object)) { | |
180 CHECK(current >= next_object_must_be_here_or_later); | |
181 object->Iterate(&visitor); | |
182 next_object_must_be_here_or_later = current + object->Size(); | |
183 } | 178 } |
184 } | 179 } |
185 } | 180 } |
186 | 181 |
187 | 182 |
188 static void VerifyEvacuation(NewSpace* space) { | 183 static void VerifyEvacuation(NewSpace* space) { |
189 NewSpacePageIterator it(space->bottom(), space->top()); | 184 NewSpacePageIterator it(space->bottom(), space->top()); |
190 VerifyEvacuationVisitor visitor; | 185 VerifyEvacuationVisitor visitor; |
191 | 186 |
192 while (it.has_next()) { | 187 while (it.has_next()) { |
193 NewSpacePage* page = it.next(); | 188 NewSpacePage* page = it.next(); |
194 Address current = page->area_start(); | 189 Address current = page->area_start(); |
195 Address limit = it.has_next() ? page->area_end() : space->top(); | 190 Address limit = it.has_next() ? page->area_end() : space->top(); |
196 CHECK(limit == space->top() || !page->Contains(space->top())); | 191 CHECK(limit == space->top() || !page->Contains(space->top())); |
197 while (current < limit) { | 192 while (current < limit) { |
198 HeapObject* object = HeapObject::FromAddress(current); | 193 HeapObject* object = HeapObject::FromAddress(current); |
199 object->Iterate(&visitor); | 194 object->Iterate(&visitor); |
200 current += object->Size(); | 195 current += object->Size(); |
201 } | 196 } |
202 } | 197 } |
203 } | 198 } |
204 | 199 |
205 | 200 |
206 static void VerifyEvacuation(PagedSpace* space) { | 201 static void VerifyEvacuation(Heap* heap, PagedSpace* space) { |
207 // TODO(hpayer): Bring back VerifyEvacuation for parallel-concurrently | 202 if (!space->swept_precisely()) return; |
208 // swept pages. | 203 if (FLAG_use_allocation_folding && |
209 if ((FLAG_concurrent_sweeping || FLAG_parallel_sweeping) && | 204 (space == heap->old_pointer_space() || space == heap->old_data_space())) { |
210 !space->swept_precisely()) return; | 205 return; |
206 } | |
211 PageIterator it(space); | 207 PageIterator it(space); |
212 | 208 |
213 while (it.has_next()) { | 209 while (it.has_next()) { |
214 Page* p = it.next(); | 210 Page* p = it.next(); |
215 if (p->IsEvacuationCandidate()) continue; | 211 if (p->IsEvacuationCandidate()) continue; |
216 VerifyEvacuation(p->area_start(), p->area_end()); | 212 VerifyEvacuation(p); |
217 } | 213 } |
218 } | 214 } |
219 | 215 |
220 | 216 |
221 static void VerifyEvacuation(Heap* heap) { | 217 static void VerifyEvacuation(Heap* heap) { |
222 VerifyEvacuation(heap->old_pointer_space()); | 218 VerifyEvacuation(heap, heap->old_pointer_space()); |
223 VerifyEvacuation(heap->old_data_space()); | 219 VerifyEvacuation(heap, heap->old_data_space()); |
224 VerifyEvacuation(heap->code_space()); | 220 VerifyEvacuation(heap, heap->code_space()); |
225 VerifyEvacuation(heap->cell_space()); | 221 VerifyEvacuation(heap, heap->cell_space()); |
226 VerifyEvacuation(heap->property_cell_space()); | 222 VerifyEvacuation(heap, heap->property_cell_space()); |
227 VerifyEvacuation(heap->map_space()); | 223 VerifyEvacuation(heap, heap->map_space()); |
228 VerifyEvacuation(heap->new_space()); | 224 VerifyEvacuation(heap->new_space()); |
229 | 225 |
230 VerifyEvacuationVisitor visitor; | 226 VerifyEvacuationVisitor visitor; |
231 heap->IterateStrongRoots(&visitor, VISIT_ALL); | 227 heap->IterateStrongRoots(&visitor, VISIT_ALL); |
232 } | 228 } |
233 #endif // VERIFY_HEAP | 229 #endif // VERIFY_HEAP |
234 | 230 |
235 | 231 |
236 #ifdef DEBUG | 232 #ifdef DEBUG |
237 class VerifyNativeContextSeparationVisitor: public ObjectVisitor { | 233 class VerifyNativeContextSeparationVisitor: public ObjectVisitor { |
(...skipping 365 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
603 // Wait twice for both jobs. | 599 // Wait twice for both jobs. |
604 pending_sweeper_jobs_semaphore_.Wait(); | 600 pending_sweeper_jobs_semaphore_.Wait(); |
605 pending_sweeper_jobs_semaphore_.Wait(); | 601 pending_sweeper_jobs_semaphore_.Wait(); |
606 } | 602 } |
607 ParallelSweepSpacesComplete(); | 603 ParallelSweepSpacesComplete(); |
608 sweeping_in_progress_ = false; | 604 sweeping_in_progress_ = false; |
609 RefillFreeList(heap()->paged_space(OLD_DATA_SPACE)); | 605 RefillFreeList(heap()->paged_space(OLD_DATA_SPACE)); |
610 RefillFreeList(heap()->paged_space(OLD_POINTER_SPACE)); | 606 RefillFreeList(heap()->paged_space(OLD_POINTER_SPACE)); |
611 heap()->paged_space(OLD_DATA_SPACE)->ResetUnsweptFreeBytes(); | 607 heap()->paged_space(OLD_DATA_SPACE)->ResetUnsweptFreeBytes(); |
612 heap()->paged_space(OLD_POINTER_SPACE)->ResetUnsweptFreeBytes(); | 608 heap()->paged_space(OLD_POINTER_SPACE)->ResetUnsweptFreeBytes(); |
609 | |
610 #ifdef VERIFY_HEAP | |
611 if (FLAG_verify_heap) { | |
612 VerifyEvacuation(heap_); | |
613 } | |
614 #endif | |
613 } | 615 } |
614 | 616 |
615 | 617 |
616 bool MarkCompactCollector::IsSweepingCompleted() { | 618 bool MarkCompactCollector::IsSweepingCompleted() { |
617 for (int i = 0; i < isolate()->num_sweeper_threads(); i++) { | 619 for (int i = 0; i < isolate()->num_sweeper_threads(); i++) { |
618 if (!isolate()->sweeper_threads()[i]->SweepingCompleted()) { | 620 if (!isolate()->sweeper_threads()[i]->SweepingCompleted()) { |
619 return false; | 621 return false; |
620 } | 622 } |
621 } | 623 } |
622 | 624 |
(...skipping 3025 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3648 | 3650 |
3649 EvacuationWeakObjectRetainer evacuation_object_retainer; | 3651 EvacuationWeakObjectRetainer evacuation_object_retainer; |
3650 heap()->ProcessWeakReferences(&evacuation_object_retainer); | 3652 heap()->ProcessWeakReferences(&evacuation_object_retainer); |
3651 | 3653 |
3652 // Visit invalidated code (we ignored all slots on it) and clear mark-bits | 3654 // Visit invalidated code (we ignored all slots on it) and clear mark-bits |
3653 // under it. | 3655 // under it. |
3654 ProcessInvalidatedCode(&updating_visitor); | 3656 ProcessInvalidatedCode(&updating_visitor); |
3655 | 3657 |
3656 heap_->isolate()->inner_pointer_to_code_cache()->Flush(); | 3658 heap_->isolate()->inner_pointer_to_code_cache()->Flush(); |
3657 | 3659 |
3658 #ifdef VERIFY_HEAP | |
3659 if (FLAG_verify_heap) { | |
3660 VerifyEvacuation(heap_); | |
3661 } | |
3662 #endif | |
3663 | |
3664 slots_buffer_allocator_.DeallocateChain(&migration_slots_buffer_); | 3660 slots_buffer_allocator_.DeallocateChain(&migration_slots_buffer_); |
3665 ASSERT(migration_slots_buffer_ == NULL); | 3661 ASSERT(migration_slots_buffer_ == NULL); |
3666 } | 3662 } |
3667 | 3663 |
3668 | 3664 |
3669 void MarkCompactCollector::MoveEvacuationCandidatesToEndOfPagesList() { | 3665 void MarkCompactCollector::MoveEvacuationCandidatesToEndOfPagesList() { |
3670 int npages = evacuation_candidates_.length(); | 3666 int npages = evacuation_candidates_.length(); |
3671 for (int i = 0; i < npages; i++) { | 3667 for (int i = 0; i < npages; i++) { |
3672 Page* p = evacuation_candidates_[i]; | 3668 Page* p = evacuation_candidates_[i]; |
3673 if (!p->IsEvacuationCandidate()) continue; | 3669 if (!p->IsEvacuationCandidate()) continue; |
(...skipping 906 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4580 while (buffer != NULL) { | 4576 while (buffer != NULL) { |
4581 SlotsBuffer* next_buffer = buffer->next(); | 4577 SlotsBuffer* next_buffer = buffer->next(); |
4582 DeallocateBuffer(buffer); | 4578 DeallocateBuffer(buffer); |
4583 buffer = next_buffer; | 4579 buffer = next_buffer; |
4584 } | 4580 } |
4585 *buffer_address = NULL; | 4581 *buffer_address = NULL; |
4586 } | 4582 } |
4587 | 4583 |
4588 | 4584 |
4589 } } // namespace v8::internal | 4585 } } // namespace v8::internal |
OLD | NEW |