| 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/heap/incremental-marking.h" | 5 #include "src/heap/incremental-marking.h" |
| 6 | 6 |
| 7 #include "src/code-stubs.h" | 7 #include "src/code-stubs.h" |
| 8 #include "src/compilation-cache.h" | 8 #include "src/compilation-cache.h" |
| 9 #include "src/conversions.h" | 9 #include "src/conversions.h" |
| 10 #include "src/heap/gc-tracer.h" | 10 #include "src/heap/gc-tracer.h" |
| (...skipping 24 matching lines...) Expand all Loading... |
| 35 marking_speed_(0), | 35 marking_speed_(0), |
| 36 bytes_scanned_(0), | 36 bytes_scanned_(0), |
| 37 allocated_(0), | 37 allocated_(0), |
| 38 write_barriers_invoked_since_last_step_(0), | 38 write_barriers_invoked_since_last_step_(0), |
| 39 idle_marking_delay_counter_(0), | 39 idle_marking_delay_counter_(0), |
| 40 no_marking_scope_depth_(0), | 40 no_marking_scope_depth_(0), |
| 41 unscanned_bytes_of_large_object_(0), | 41 unscanned_bytes_of_large_object_(0), |
| 42 was_activated_(false), | 42 was_activated_(false), |
| 43 weak_closure_was_overapproximated_(false), | 43 weak_closure_was_overapproximated_(false), |
| 44 weak_closure_approximation_rounds_(0), | 44 weak_closure_approximation_rounds_(0), |
| 45 request_type_(COMPLETE_MARKING), | 45 request_type_(COMPLETE_MARKING) {} |
| 46 gc_callback_flags_(kNoGCCallbackFlags) {} | |
| 47 | 46 |
| 48 | 47 |
| 49 void IncrementalMarking::RecordWriteSlow(HeapObject* obj, Object** slot, | 48 void IncrementalMarking::RecordWriteSlow(HeapObject* obj, Object** slot, |
| 50 Object* value) { | 49 Object* value) { |
| 51 if (BaseRecordWrite(obj, slot, value) && slot != NULL) { | 50 if (BaseRecordWrite(obj, slot, value) && slot != NULL) { |
| 52 MarkBit obj_bit = Marking::MarkBitFrom(obj); | 51 MarkBit obj_bit = Marking::MarkBitFrom(obj); |
| 53 if (Marking::IsBlack(obj_bit)) { | 52 if (Marking::IsBlack(obj_bit)) { |
| 54 // Object is not going to be rescanned we need to record the slot. | 53 // Object is not going to be rescanned we need to record the slot. |
| 55 heap_->mark_compact_collector()->RecordSlot(obj, slot, value); | 54 heap_->mark_compact_collector()->RecordSlot(obj, slot, value); |
| 56 } | 55 } |
| (...skipping 399 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 456 Object* e = stubs->ValueAt(i); | 455 Object* e = stubs->ValueAt(i); |
| 457 if (e->IsCode()) { | 456 if (e->IsCode()) { |
| 458 RecordWriteStub::Patch(Code::cast(e), mode); | 457 RecordWriteStub::Patch(Code::cast(e), mode); |
| 459 } | 458 } |
| 460 } | 459 } |
| 461 } | 460 } |
| 462 } | 461 } |
| 463 } | 462 } |
| 464 | 463 |
| 465 | 464 |
| 466 void IncrementalMarking::Start(int flags, | 465 void IncrementalMarking::Start(const char* reason) { |
| 467 const GCCallbackFlags gc_callback_flags, | |
| 468 const char* reason) { | |
| 469 if (FLAG_trace_incremental_marking) { | 466 if (FLAG_trace_incremental_marking) { |
| 470 PrintF("[IncrementalMarking] Start (%s)\n", | 467 PrintF("[IncrementalMarking] Start (%s)\n", |
| 471 (reason == nullptr) ? "unknown reason" : reason); | 468 (reason == nullptr) ? "unknown reason" : reason); |
| 472 } | 469 } |
| 473 DCHECK(FLAG_incremental_marking); | 470 DCHECK(FLAG_incremental_marking); |
| 474 DCHECK(state_ == STOPPED); | 471 DCHECK(state_ == STOPPED); |
| 475 DCHECK(heap_->gc_state() == Heap::NOT_IN_GC); | 472 DCHECK(heap_->gc_state() == Heap::NOT_IN_GC); |
| 476 DCHECK(!heap_->isolate()->serializer_enabled()); | 473 DCHECK(!heap_->isolate()->serializer_enabled()); |
| 477 | 474 |
| 478 ResetStepCounters(); | 475 ResetStepCounters(); |
| 479 | 476 |
| 480 gc_callback_flags_ = gc_callback_flags; | |
| 481 was_activated_ = true; | 477 was_activated_ = true; |
| 482 | 478 |
| 483 if (!heap_->mark_compact_collector()->sweeping_in_progress()) { | 479 if (!heap_->mark_compact_collector()->sweeping_in_progress()) { |
| 484 heap_->set_current_gc_flags(flags); | |
| 485 StartMarking(); | 480 StartMarking(); |
| 486 } else { | 481 } else { |
| 487 if (FLAG_trace_incremental_marking) { | 482 if (FLAG_trace_incremental_marking) { |
| 488 PrintF("[IncrementalMarking] Start sweeping.\n"); | 483 PrintF("[IncrementalMarking] Start sweeping.\n"); |
| 489 } | 484 } |
| 490 state_ = SWEEPING; | 485 state_ = SWEEPING; |
| 491 } | 486 } |
| 492 | 487 |
| 493 heap_->new_space()->LowerInlineAllocationLimit(kAllocatedThreshold); | 488 heap_->new_space()->LowerInlineAllocationLimit(kAllocatedThreshold); |
| 494 } | 489 } |
| (...skipping 317 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 812 | 807 |
| 813 void IncrementalMarking::Epilogue() { | 808 void IncrementalMarking::Epilogue() { |
| 814 was_activated_ = false; | 809 was_activated_ = false; |
| 815 weak_closure_was_overapproximated_ = false; | 810 weak_closure_was_overapproximated_ = false; |
| 816 weak_closure_approximation_rounds_ = 0; | 811 weak_closure_approximation_rounds_ = 0; |
| 817 } | 812 } |
| 818 | 813 |
| 819 | 814 |
| 820 void IncrementalMarking::OldSpaceStep(intptr_t allocated) { | 815 void IncrementalMarking::OldSpaceStep(intptr_t allocated) { |
| 821 if (IsStopped() && ShouldActivateEvenWithoutIdleNotification()) { | 816 if (IsStopped() && ShouldActivateEvenWithoutIdleNotification()) { |
| 822 Start(Heap::kNoGCFlags, kNoGCCallbackFlags, "old space step"); | 817 heap()->StartIncrementalMarking(Heap::kNoGCFlags, kNoGCCallbackFlags, |
| 818 "old space step"); |
| 823 } else { | 819 } else { |
| 824 Step(allocated * kFastMarking / kInitialMarkingSpeed, GC_VIA_STACK_GUARD); | 820 Step(allocated * kFastMarking / kInitialMarkingSpeed, GC_VIA_STACK_GUARD); |
| 825 } | 821 } |
| 826 } | 822 } |
| 827 | 823 |
| 828 | 824 |
| 829 void IncrementalMarking::SpeedUp() { | 825 void IncrementalMarking::SpeedUp() { |
| 830 bool speed_up = false; | 826 bool speed_up = false; |
| 831 | 827 |
| 832 if ((steps_count_ % kMarkingSpeedAccellerationInterval) == 0) { | 828 if ((steps_count_ % kMarkingSpeedAccellerationInterval) == 0) { |
| (...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1015 void IncrementalMarking::IncrementIdleMarkingDelayCounter() { | 1011 void IncrementalMarking::IncrementIdleMarkingDelayCounter() { |
| 1016 idle_marking_delay_counter_++; | 1012 idle_marking_delay_counter_++; |
| 1017 } | 1013 } |
| 1018 | 1014 |
| 1019 | 1015 |
| 1020 void IncrementalMarking::ClearIdleMarkingDelayCounter() { | 1016 void IncrementalMarking::ClearIdleMarkingDelayCounter() { |
| 1021 idle_marking_delay_counter_ = 0; | 1017 idle_marking_delay_counter_ = 0; |
| 1022 } | 1018 } |
| 1023 } // namespace internal | 1019 } // namespace internal |
| 1024 } // namespace v8 | 1020 } // namespace v8 |
| OLD | NEW |