Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(609)

Side by Side Diff: src/heap/mark-compact.cc

Issue 1813923002: Update pointers in to-space in parallel after evacuation. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/heap/mark-compact.h" 5 #include "src/heap/mark-compact.h"
6 6
7 #include "src/base/atomicops.h" 7 #include "src/base/atomicops.h"
8 #include "src/base/bits.h" 8 #include "src/base/bits.h"
9 #include "src/base/sys-info.h" 9 #include "src/base/sys-info.h"
10 #include "src/code-stubs.h" 10 #include "src/code-stubs.h"
(...skipping 3569 matching lines...) Expand 10 before | Expand all | Expand 10 after
3580 heap, heap->isolate()->cancelable_task_manager()); 3580 heap, heap->isolate()->cancelable_task_manager());
3581 RememberedSet<direction>::IterateMemoryChunks( 3581 RememberedSet<direction>::IterateMemoryChunks(
3582 heap, [job](MemoryChunk* chunk) { job->AddPage(chunk, 0); }); 3582 heap, [job](MemoryChunk* chunk) { job->AddPage(chunk, 0); });
3583 PointersUpdatingVisitor visitor(heap); 3583 PointersUpdatingVisitor visitor(heap);
3584 int num_pages = job->NumberOfPages(); 3584 int num_pages = job->NumberOfPages();
3585 int num_tasks = NumberOfPointerUpdateTasks(num_pages); 3585 int num_tasks = NumberOfPointerUpdateTasks(num_pages);
3586 job->Run(num_tasks, [&visitor](int i) { return &visitor; }); 3586 job->Run(num_tasks, [&visitor](int i) { return &visitor; });
3587 delete job; 3587 delete job;
3588 } 3588 }
3589 3589
3590 class ToSpacePointerUpdateJobTraits {
3591 public:
3592 typedef std::pair<Address, Address> PerPageData;
3593 typedef PointersUpdatingVisitor* PerTaskData;
3594
3595 static bool ProcessPageInParallel(Heap* heap, PerTaskData visitor,
3596 MemoryChunk* chunk, PerPageData limits) {
3597 for (Address cur = limits.first; cur < limits.second;) {
3598 HeapObject* object = HeapObject::FromAddress(cur);
3599 Map* map = object->map();
3600 int size = object->SizeFromMap(map);
3601 object->IterateBody(map->instance_type(), size, visitor);
3602 cur += size;
3603 }
3604 return true;
3605 }
3606 static const bool NeedSequentialFinalization = false;
3607 static void FinalizePageSequentially(Heap*, MemoryChunk*, bool, PerPageData) {
3608 }
3609 };
3610
3611 void UpdateToSpacePointersInParallel(Heap* heap) {
3612 PageParallelJob<ToSpacePointerUpdateJobTraits> job(
3613 heap, heap->isolate()->cancelable_task_manager());
3614 Address space_start = heap->new_space()->bottom();
3615 Address space_end = heap->new_space()->top();
3616 NewSpacePageIterator it(space_start, space_end);
3617 while (it.has_next()) {
3618 NewSpacePage* page = it.next();
3619 Address start =
3620 page->Contains(space_start) ? space_start : page->area_start();
3621 Address end = page->Contains(space_end) ? space_end : page->area_end();
3622 job.AddPage(page, std::make_pair(start, end));
3623 }
3624 PointersUpdatingVisitor visitor(heap);
3625 int num_tasks = FLAG_parallel_pointer_update ? job.NumberOfPages() : 1;
3626 job.Run(num_tasks, [&visitor](int i) { return &visitor; });
3627 }
3628
3590 void MarkCompactCollector::UpdatePointersAfterEvacuation() { 3629 void MarkCompactCollector::UpdatePointersAfterEvacuation() {
3591 GCTracer::Scope gc_scope(heap()->tracer(), 3630 GCTracer::Scope gc_scope(heap()->tracer(),
3592 GCTracer::Scope::MC_EVACUATE_UPDATE_POINTERS); 3631 GCTracer::Scope::MC_EVACUATE_UPDATE_POINTERS);
3593 3632
3594 PointersUpdatingVisitor updating_visitor(heap()); 3633 PointersUpdatingVisitor updating_visitor(heap());
3595 3634
3596 { 3635 {
3597 GCTracer::Scope gc_scope( 3636 GCTracer::Scope gc_scope(
3598 heap()->tracer(), GCTracer::Scope::MC_EVACUATE_UPDATE_POINTERS_TO_NEW); 3637 heap()->tracer(), GCTracer::Scope::MC_EVACUATE_UPDATE_POINTERS_TO_NEW);
3599 // Update pointers in to space. 3638 UpdateToSpacePointersInParallel(heap_);
3600 SemiSpaceIterator to_it(heap()->new_space());
3601 for (HeapObject* object = to_it.Next(); object != NULL;
3602 object = to_it.Next()) {
3603 Map* map = object->map();
3604 object->IterateBody(map->instance_type(), object->SizeFromMap(map),
3605 &updating_visitor);
3606 }
3607 // Update roots. 3639 // Update roots.
3608 heap_->IterateRoots(&updating_visitor, VISIT_ALL_IN_SWEEP_NEWSPACE); 3640 heap_->IterateRoots(&updating_visitor, VISIT_ALL_IN_SWEEP_NEWSPACE);
3609
3610 UpdatePointersInParallel<OLD_TO_NEW>(heap_); 3641 UpdatePointersInParallel<OLD_TO_NEW>(heap_);
3611 } 3642 }
3612 3643
3613 { 3644 {
3614 Heap* heap = this->heap(); 3645 Heap* heap = this->heap();
3615 GCTracer::Scope gc_scope( 3646 GCTracer::Scope gc_scope(
3616 heap->tracer(), 3647 heap->tracer(),
3617 GCTracer::Scope::MC_EVACUATE_UPDATE_POINTERS_TO_EVACUATED); 3648 GCTracer::Scope::MC_EVACUATE_UPDATE_POINTERS_TO_EVACUATED);
3618 UpdatePointersInParallel<OLD_TO_OLD>(heap_); 3649 UpdatePointersInParallel<OLD_TO_OLD>(heap_);
3619 } 3650 }
(...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after
3863 MarkBit mark_bit = Marking::MarkBitFrom(host); 3894 MarkBit mark_bit = Marking::MarkBitFrom(host);
3864 if (Marking::IsBlack(mark_bit)) { 3895 if (Marking::IsBlack(mark_bit)) {
3865 RelocInfo rinfo(isolate(), pc, RelocInfo::CODE_TARGET, 0, host); 3896 RelocInfo rinfo(isolate(), pc, RelocInfo::CODE_TARGET, 0, host);
3866 RecordRelocSlot(host, &rinfo, target); 3897 RecordRelocSlot(host, &rinfo, target);
3867 } 3898 }
3868 } 3899 }
3869 } 3900 }
3870 3901
3871 } // namespace internal 3902 } // namespace internal
3872 } // namespace v8 3903 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698