| 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/heap/incremental-marking.h" | 7 #include "src/heap/incremental-marking.h" |
| 8 | 8 |
| 9 #include "src/code-stubs.h" | 9 #include "src/code-stubs.h" |
| 10 #include "src/compilation-cache.h" | 10 #include "src/compilation-cache.h" |
| 11 #include "src/conversions.h" | 11 #include "src/conversions.h" |
| 12 #include "src/heap/objects-visiting.h" | 12 #include "src/heap/objects-visiting.h" |
| 13 #include "src/heap/objects-visiting-inl.h" | 13 #include "src/heap/objects-visiting-inl.h" |
| 14 | 14 |
| 15 namespace v8 { | 15 namespace v8 { |
| 16 namespace internal { | 16 namespace internal { |
| 17 | 17 |
| 18 | 18 |
| 19 IncrementalMarking::IncrementalMarking(Heap* heap) | 19 IncrementalMarking::IncrementalMarking(Heap* heap) |
| 20 : heap_(heap), | 20 : heap_(heap), |
| 21 state_(STOPPED), | 21 state_(STOPPED), |
| 22 steps_count_(0), | 22 steps_count_(0), |
| 23 old_generation_space_available_at_start_of_incremental_(0), | 23 old_generation_space_available_at_start_of_incremental_(0), |
| 24 old_generation_space_used_at_start_of_incremental_(0), | 24 old_generation_space_used_at_start_of_incremental_(0), |
| 25 should_hurry_(false), | 25 should_hurry_(false), |
| 26 marking_speed_(0), | 26 marking_speed_(0), |
| 27 allocated_(0), | 27 allocated_(0), |
| 28 idle_marking_delay_counter_(0), | 28 idle_marking_delay_counter_(0), |
| 29 no_marking_scope_depth_(0), | 29 no_marking_scope_depth_(0), |
| 30 unscanned_bytes_of_large_object_(0) {} | 30 unscanned_bytes_of_large_object_(0), |
| 31 was_activated_(false) {} |
| 31 | 32 |
| 32 | 33 |
| 33 void IncrementalMarking::RecordWriteSlow(HeapObject* obj, Object** slot, | 34 void IncrementalMarking::RecordWriteSlow(HeapObject* obj, Object** slot, |
| 34 Object* value) { | 35 Object* value) { |
| 35 if (BaseRecordWrite(obj, slot, value) && slot != NULL) { | 36 if (BaseRecordWrite(obj, slot, value) && slot != NULL) { |
| 36 MarkBit obj_bit = Marking::MarkBitFrom(obj); | 37 MarkBit obj_bit = Marking::MarkBitFrom(obj); |
| 37 if (Marking::IsBlack(obj_bit)) { | 38 if (Marking::IsBlack(obj_bit)) { |
| 38 // Object is not going to be rescanned we need to record the slot. | 39 // Object is not going to be rescanned we need to record the slot. |
| 39 heap_->mark_compact_collector()->RecordSlot(HeapObject::RawField(obj, 0), | 40 heap_->mark_compact_collector()->RecordSlot(HeapObject::RawField(obj, 0), |
| 40 slot, value); | 41 slot, value); |
| (...skipping 375 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 416 lop = lop->next_page(); | 417 lop = lop->next_page(); |
| 417 } | 418 } |
| 418 } | 419 } |
| 419 | 420 |
| 420 | 421 |
| 421 bool IncrementalMarking::ShouldActivate() { | 422 bool IncrementalMarking::ShouldActivate() { |
| 422 return WorthActivating() && heap_->NextGCIsLikelyToBeFull(); | 423 return WorthActivating() && heap_->NextGCIsLikelyToBeFull(); |
| 423 } | 424 } |
| 424 | 425 |
| 425 | 426 |
| 427 bool IncrementalMarking::WasActivated() { return was_activated_; } |
| 428 |
| 429 |
| 426 bool IncrementalMarking::WorthActivating() { | 430 bool IncrementalMarking::WorthActivating() { |
| 427 #ifndef DEBUG | 431 #ifndef DEBUG |
| 428 static const intptr_t kActivationThreshold = 8 * MB; | 432 static const intptr_t kActivationThreshold = 8 * MB; |
| 429 #else | 433 #else |
| 430 // TODO(gc) consider setting this to some low level so that some | 434 // TODO(gc) consider setting this to some low level so that some |
| 431 // debug tests run with incremental marking and some without. | 435 // debug tests run with incremental marking and some without. |
| 432 static const intptr_t kActivationThreshold = 0; | 436 static const intptr_t kActivationThreshold = 0; |
| 433 #endif | 437 #endif |
| 434 // Only start incremental marking in a safe state: 1) when incremental | 438 // Only start incremental marking in a safe state: 1) when incremental |
| 435 // marking is turned on, 2) when we are currently not in a GC, and | 439 // marking is turned on, 2) when we are currently not in a GC, and |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 483 PrintF("[IncrementalMarking] Start\n"); | 487 PrintF("[IncrementalMarking] Start\n"); |
| 484 } | 488 } |
| 485 DCHECK(FLAG_incremental_marking); | 489 DCHECK(FLAG_incremental_marking); |
| 486 DCHECK(FLAG_incremental_marking_steps); | 490 DCHECK(FLAG_incremental_marking_steps); |
| 487 DCHECK(state_ == STOPPED); | 491 DCHECK(state_ == STOPPED); |
| 488 DCHECK(heap_->gc_state() == Heap::NOT_IN_GC); | 492 DCHECK(heap_->gc_state() == Heap::NOT_IN_GC); |
| 489 DCHECK(!heap_->isolate()->serializer_enabled()); | 493 DCHECK(!heap_->isolate()->serializer_enabled()); |
| 490 | 494 |
| 491 ResetStepCounters(); | 495 ResetStepCounters(); |
| 492 | 496 |
| 497 was_activated_ = true; |
| 498 |
| 493 if (!heap_->mark_compact_collector()->sweeping_in_progress()) { | 499 if (!heap_->mark_compact_collector()->sweeping_in_progress()) { |
| 494 StartMarking(flag); | 500 StartMarking(flag); |
| 495 } else { | 501 } else { |
| 496 if (FLAG_trace_incremental_marking) { | 502 if (FLAG_trace_incremental_marking) { |
| 497 PrintF("[IncrementalMarking] Start sweeping.\n"); | 503 PrintF("[IncrementalMarking] Start sweeping.\n"); |
| 498 } | 504 } |
| 499 state_ = SWEEPING; | 505 state_ = SWEEPING; |
| 500 } | 506 } |
| 501 | 507 |
| 502 heap_->new_space()->LowerInlineAllocationLimit(kAllocatedThreshold); | 508 heap_->new_space()->LowerInlineAllocationLimit(kAllocatedThreshold); |
| (...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 778 set_should_hurry(true); | 784 set_should_hurry(true); |
| 779 if (FLAG_trace_incremental_marking) { | 785 if (FLAG_trace_incremental_marking) { |
| 780 PrintF("[IncrementalMarking] Complete (normal).\n"); | 786 PrintF("[IncrementalMarking] Complete (normal).\n"); |
| 781 } | 787 } |
| 782 if (action == GC_VIA_STACK_GUARD) { | 788 if (action == GC_VIA_STACK_GUARD) { |
| 783 heap_->isolate()->stack_guard()->RequestGC(); | 789 heap_->isolate()->stack_guard()->RequestGC(); |
| 784 } | 790 } |
| 785 } | 791 } |
| 786 | 792 |
| 787 | 793 |
| 794 void IncrementalMarking::Epilogue() { was_activated_ = false; } |
| 795 |
| 796 |
| 788 void IncrementalMarking::OldSpaceStep(intptr_t allocated) { | 797 void IncrementalMarking::OldSpaceStep(intptr_t allocated) { |
| 789 if (IsStopped() && ShouldActivate()) { | 798 if (IsStopped() && ShouldActivate()) { |
| 790 // TODO(hpayer): Let's play safe for now, but compaction should be | 799 // TODO(hpayer): Let's play safe for now, but compaction should be |
| 791 // in principle possible. | 800 // in principle possible. |
| 792 Start(PREVENT_COMPACTION); | 801 Start(PREVENT_COMPACTION); |
| 793 } else { | 802 } else { |
| 794 Step(allocated * kFastMarking / kInitialMarkingSpeed, GC_VIA_STACK_GUARD); | 803 Step(allocated * kFastMarking / kInitialMarkingSpeed, GC_VIA_STACK_GUARD); |
| 795 } | 804 } |
| 796 } | 805 } |
| 797 | 806 |
| (...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 975 void IncrementalMarking::IncrementIdleMarkingDelayCounter() { | 984 void IncrementalMarking::IncrementIdleMarkingDelayCounter() { |
| 976 idle_marking_delay_counter_++; | 985 idle_marking_delay_counter_++; |
| 977 } | 986 } |
| 978 | 987 |
| 979 | 988 |
| 980 void IncrementalMarking::ClearIdleMarkingDelayCounter() { | 989 void IncrementalMarking::ClearIdleMarkingDelayCounter() { |
| 981 idle_marking_delay_counter_ = 0; | 990 idle_marking_delay_counter_ = 0; |
| 982 } | 991 } |
| 983 } | 992 } |
| 984 } // namespace v8::internal | 993 } // namespace v8::internal |
| OLD | NEW |