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

Side by Side Diff: src/heap/heap.cc

Issue 2847953002: [heap] Cleanup: Untangle marking state and deque in incremental marking (Closed)
Patch Set: Remove unused parameter Created 3 years, 7 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 | src/heap/incremental-marking.h » ('j') | 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/heap.h" 5 #include "src/heap/heap.h"
6 6
7 #include "src/accessors.h" 7 #include "src/accessors.h"
8 #include "src/api.h" 8 #include "src/api.h"
9 #include "src/assembler-inl.h" 9 #include "src/assembler-inl.h"
10 #include "src/ast/context-slot-cache.h" 10 #include "src/ast/context-slot-cache.h"
(...skipping 3184 matching lines...) Expand 10 before | Expand all | Expand 10 after
3195 // Calculate location of new array start. 3195 // Calculate location of new array start.
3196 Address old_start = object->address(); 3196 Address old_start = object->address();
3197 Address new_start = old_start + bytes_to_trim; 3197 Address new_start = old_start + bytes_to_trim;
3198 3198
3199 // Transfer the mark bits to their new location if the object is not within 3199 // Transfer the mark bits to their new location if the object is not within
3200 // a black area. 3200 // a black area.
3201 if (!incremental_marking()->black_allocation() || 3201 if (!incremental_marking()->black_allocation() ||
3202 !Marking::IsBlack(ObjectMarking::MarkBitFrom( 3202 !Marking::IsBlack(ObjectMarking::MarkBitFrom(
3203 HeapObject::FromAddress(new_start), 3203 HeapObject::FromAddress(new_start),
3204 MarkingState::Internal(HeapObject::FromAddress(new_start))))) { 3204 MarkingState::Internal(HeapObject::FromAddress(new_start))))) {
3205 IncrementalMarking::TransferMark(this, object, 3205 incremental_marking()->TransferMark(this, object,
3206 HeapObject::FromAddress(new_start)); 3206 HeapObject::FromAddress(new_start));
3207 } 3207 }
3208 3208
3209 // Technically in new space this write might be omitted (except for 3209 // Technically in new space this write might be omitted (except for
3210 // debug mode which iterates through the heap), but to play safer 3210 // debug mode which iterates through the heap), but to play safer
3211 // we still do it. 3211 // we still do it.
3212 CreateFillerObjectAt(old_start, bytes_to_trim, ClearRecordedSlots::kYes); 3212 CreateFillerObjectAt(old_start, bytes_to_trim, ClearRecordedSlots::kYes);
3213 3213
3214 // Initialize header of the trimmed array. Since left trimming is only 3214 // Initialize header of the trimmed array. Since left trimming is only
3215 // performed on pages which are not concurrently swept creating a filler 3215 // performed on pages which are not concurrently swept creating a filler
3216 // object does not require synchronization. 3216 // object does not require synchronization.
(...skipping 1064 matching lines...) Expand 10 before | Expand all | Expand 10 after
4281 addr += obj->Size(); 4281 addr += obj->Size();
4282 } 4282 }
4283 } 4283 }
4284 } 4284 }
4285 } 4285 }
4286 } 4286 }
4287 4287
4288 void Heap::NotifyObjectLayoutChange(HeapObject* object, 4288 void Heap::NotifyObjectLayoutChange(HeapObject* object,
4289 const DisallowHeapAllocation&) { 4289 const DisallowHeapAllocation&) {
4290 if (FLAG_incremental_marking && incremental_marking()->IsMarking()) { 4290 if (FLAG_incremental_marking && incremental_marking()->IsMarking()) {
4291 incremental_marking()->MarkGrey(this, object); 4291 incremental_marking()->MarkGrey(object);
4292 } 4292 }
4293 #ifdef VERIFY_HEAP 4293 #ifdef VERIFY_HEAP
4294 DCHECK(pending_layout_change_object_ == nullptr); 4294 DCHECK(pending_layout_change_object_ == nullptr);
4295 pending_layout_change_object_ = object; 4295 pending_layout_change_object_ = object;
4296 #endif 4296 #endif
4297 } 4297 }
4298 4298
4299 #ifdef VERIFY_HEAP 4299 #ifdef VERIFY_HEAP
4300 void Heap::VerifyObjectLayoutChange(HeapObject* object, Map* new_map) { 4300 void Heap::VerifyObjectLayoutChange(HeapObject* object, Map* new_map) {
4301 if (pending_layout_change_object_ == nullptr) { 4301 if (pending_layout_change_object_ == nullptr) {
(...skipping 546 matching lines...) Expand 10 before | Expand all | Expand 10 after
4848 slot_address += kPointerSize; 4848 slot_address += kPointerSize;
4849 } 4849 }
4850 } 4850 }
4851 4851
4852 inline void VisitCodeEntry(JSFunction* host, 4852 inline void VisitCodeEntry(JSFunction* host,
4853 Address code_entry_slot) override { 4853 Address code_entry_slot) override {
4854 // Black allocation requires us to process objects referenced by 4854 // Black allocation requires us to process objects referenced by
4855 // promoted objects. 4855 // promoted objects.
4856 if (heap_->incremental_marking()->black_allocation()) { 4856 if (heap_->incremental_marking()->black_allocation()) {
4857 Code* code = Code::cast(Code::GetObjectFromEntryAddress(code_entry_slot)); 4857 Code* code = Code::cast(Code::GetObjectFromEntryAddress(code_entry_slot));
4858 IncrementalMarking::MarkGrey(heap_, code); 4858 heap_->incremental_marking()->MarkGrey(code);
4859 } 4859 }
4860 } 4860 }
4861 4861
4862 private: 4862 private:
4863 Heap* heap_; 4863 Heap* heap_;
4864 HeapObject* target_; 4864 HeapObject* target_;
4865 bool record_slots_; 4865 bool record_slots_;
4866 }; 4866 };
4867 4867
4868 void Heap::IterateAndScavengePromotedObject(HeapObject* target, int size, 4868 void Heap::IterateAndScavengePromotedObject(HeapObject* target, int size,
(...skipping 21 matching lines...) Expand all
4890 target->IterateBody(target->map()->instance_type(), size, &visitor); 4890 target->IterateBody(target->map()->instance_type(), size, &visitor);
4891 } 4891 }
4892 4892
4893 // When black allocations is on, we have to visit not already marked black 4893 // When black allocations is on, we have to visit not already marked black
4894 // objects (in new space) promoted to black pages to keep their references 4894 // objects (in new space) promoted to black pages to keep their references
4895 // alive. 4895 // alive.
4896 // TODO(hpayer): Implement a special promotion visitor that incorporates 4896 // TODO(hpayer): Implement a special promotion visitor that incorporates
4897 // regular visiting and IteratePromotedObjectPointers. 4897 // regular visiting and IteratePromotedObjectPointers.
4898 if (!was_marked_black) { 4898 if (!was_marked_black) {
4899 if (incremental_marking()->black_allocation()) { 4899 if (incremental_marking()->black_allocation()) {
4900 IncrementalMarking::MarkGrey(this, target->map()); 4900 incremental_marking()->MarkGrey(target->map());
4901 incremental_marking()->IterateBlackObject(target); 4901 incremental_marking()->IterateBlackObject(target);
4902 } 4902 }
4903 } 4903 }
4904 } 4904 }
4905 4905
4906 void Heap::IterateRoots(RootVisitor* v, VisitMode mode) { 4906 void Heap::IterateRoots(RootVisitor* v, VisitMode mode) {
4907 IterateStrongRoots(v, mode); 4907 IterateStrongRoots(v, mode);
4908 IterateWeakRoots(v, mode); 4908 IterateWeakRoots(v, mode);
4909 } 4909 }
4910 4910
(...skipping 599 matching lines...) Expand 10 before | Expand all | Expand 10 after
5510 5510
5511 // Set up memory allocator. 5511 // Set up memory allocator.
5512 memory_allocator_ = new MemoryAllocator(isolate_); 5512 memory_allocator_ = new MemoryAllocator(isolate_);
5513 if (!memory_allocator_->SetUp(MaxReserved(), MaxExecutableSize(), 5513 if (!memory_allocator_->SetUp(MaxReserved(), MaxExecutableSize(),
5514 code_range_size_)) 5514 code_range_size_))
5515 return false; 5515 return false;
5516 5516
5517 store_buffer_ = new StoreBuffer(this); 5517 store_buffer_ = new StoreBuffer(this);
5518 5518
5519 incremental_marking_ = new IncrementalMarking(this); 5519 incremental_marking_ = new IncrementalMarking(this);
5520
5521 concurrent_marking_ = new ConcurrentMarking(this); 5520 concurrent_marking_ = new ConcurrentMarking(this);
5522 5521
5523 for (int i = 0; i <= LAST_SPACE; i++) { 5522 for (int i = 0; i <= LAST_SPACE; i++) {
5524 space_[i] = nullptr; 5523 space_[i] = nullptr;
5525 } 5524 }
5526 5525
5527 space_[NEW_SPACE] = new_space_ = new NewSpace(this); 5526 space_[NEW_SPACE] = new_space_ = new NewSpace(this);
5528 if (!new_space_->SetUp(initial_semispace_size_, max_semi_space_size_)) { 5527 if (!new_space_->SetUp(initial_semispace_size_, max_semi_space_size_)) {
5529 return false; 5528 return false;
5530 } 5529 }
(...skipping 27 matching lines...) Expand all
5558 } 5557 }
5559 5558
5560 for (int i = 0; i < static_cast<int>(v8::Isolate::kUseCounterFeatureCount); 5559 for (int i = 0; i < static_cast<int>(v8::Isolate::kUseCounterFeatureCount);
5561 i++) { 5560 i++) {
5562 deferred_counters_[i] = 0; 5561 deferred_counters_[i] = 0;
5563 } 5562 }
5564 5563
5565 tracer_ = new GCTracer(this); 5564 tracer_ = new GCTracer(this);
5566 scavenge_collector_ = new Scavenger(this); 5565 scavenge_collector_ = new Scavenger(this);
5567 mark_compact_collector_ = new MarkCompactCollector(this); 5566 mark_compact_collector_ = new MarkCompactCollector(this);
5567 incremental_marking_->set_marking_deque(
5568 mark_compact_collector_->marking_deque());
5568 if (FLAG_minor_mc) 5569 if (FLAG_minor_mc)
5569 minor_mark_compact_collector_ = new MinorMarkCompactCollector(this); 5570 minor_mark_compact_collector_ = new MinorMarkCompactCollector(this);
5570 gc_idle_time_handler_ = new GCIdleTimeHandler(); 5571 gc_idle_time_handler_ = new GCIdleTimeHandler();
5571 memory_reducer_ = new MemoryReducer(this); 5572 memory_reducer_ = new MemoryReducer(this);
5572 if (V8_UNLIKELY(FLAG_gc_stats)) { 5573 if (V8_UNLIKELY(FLAG_gc_stats)) {
5573 live_object_stats_ = new ObjectStats(this); 5574 live_object_stats_ = new ObjectStats(this);
5574 dead_object_stats_ = new ObjectStats(this); 5575 dead_object_stats_ = new ObjectStats(this);
5575 } 5576 }
5576 scavenge_job_ = new ScavengeJob(); 5577 scavenge_job_ = new ScavengeJob();
5577 local_embedder_heap_tracer_ = new LocalEmbedderHeapTracer(); 5578 local_embedder_heap_tracer_ = new LocalEmbedderHeapTracer();
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
5669 } 5670 }
5670 } 5671 }
5671 5672
5672 void Heap::RegisterExternallyReferencedObject(Object** object) { 5673 void Heap::RegisterExternallyReferencedObject(Object** object) {
5673 // The embedder is not aware of whether numbers are materialized as heap 5674 // The embedder is not aware of whether numbers are materialized as heap
5674 // objects are just passed around as Smis. 5675 // objects are just passed around as Smis.
5675 if (!(*object)->IsHeapObject()) return; 5676 if (!(*object)->IsHeapObject()) return;
5676 HeapObject* heap_object = HeapObject::cast(*object); 5677 HeapObject* heap_object = HeapObject::cast(*object);
5677 DCHECK(Contains(heap_object)); 5678 DCHECK(Contains(heap_object));
5678 if (FLAG_incremental_marking_wrappers && incremental_marking()->IsMarking()) { 5679 if (FLAG_incremental_marking_wrappers && incremental_marking()->IsMarking()) {
5679 IncrementalMarking::MarkGrey(this, heap_object); 5680 incremental_marking()->MarkGrey(heap_object);
5680 } else { 5681 } else {
5681 DCHECK(mark_compact_collector()->in_use()); 5682 DCHECK(mark_compact_collector()->in_use());
5682 mark_compact_collector()->MarkObject(heap_object); 5683 mark_compact_collector()->MarkObject(heap_object);
5683 } 5684 }
5684 } 5685 }
5685 5686
5686 void Heap::TearDown() { 5687 void Heap::TearDown() {
5687 #ifdef VERIFY_HEAP 5688 #ifdef VERIFY_HEAP
5688 if (FLAG_verify_heap) { 5689 if (FLAG_verify_heap) {
5689 Verify(); 5690 Verify();
(...skipping 747 matching lines...) Expand 10 before | Expand all | Expand 10 after
6437 case LO_SPACE: 6438 case LO_SPACE:
6438 return "LO_SPACE"; 6439 return "LO_SPACE";
6439 default: 6440 default:
6440 UNREACHABLE(); 6441 UNREACHABLE();
6441 } 6442 }
6442 return NULL; 6443 return NULL;
6443 } 6444 }
6444 6445
6445 } // namespace internal 6446 } // namespace internal
6446 } // namespace v8 6447 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | src/heap/incremental-marking.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698