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" |
(...skipping 10 matching lines...) Expand all Loading... |
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 was_activated_(false), |
| 32 weak_closure_was_overapproximated_(false), |
| 33 request_type_(COMPLETE_MARKING) {} |
32 | 34 |
33 | 35 |
34 void IncrementalMarking::RecordWriteSlow(HeapObject* obj, Object** slot, | 36 void IncrementalMarking::RecordWriteSlow(HeapObject* obj, Object** slot, |
35 Object* value) { | 37 Object* value) { |
36 if (BaseRecordWrite(obj, slot, value) && slot != NULL) { | 38 if (BaseRecordWrite(obj, slot, value) && slot != NULL) { |
37 MarkBit obj_bit = Marking::MarkBitFrom(obj); | 39 MarkBit obj_bit = Marking::MarkBitFrom(obj); |
38 if (Marking::IsBlack(obj_bit)) { | 40 if (Marking::IsBlack(obj_bit)) { |
39 // Object is not going to be rescanned we need to record the slot. | 41 // Object is not going to be rescanned we need to record the slot. |
40 heap_->mark_compact_collector()->RecordSlot(HeapObject::RawField(obj, 0), | 42 heap_->mark_compact_collector()->RecordSlot(HeapObject::RawField(obj, 0), |
41 slot, value); | 43 slot, value); |
(...skipping 722 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
764 IncrementalMarking::set_should_hurry(false); | 766 IncrementalMarking::set_should_hurry(false); |
765 ResetStepCounters(); | 767 ResetStepCounters(); |
766 PatchIncrementalMarkingRecordWriteStubs(heap_, | 768 PatchIncrementalMarkingRecordWriteStubs(heap_, |
767 RecordWriteStub::STORE_BUFFER_ONLY); | 769 RecordWriteStub::STORE_BUFFER_ONLY); |
768 DeactivateIncrementalWriteBarrier(); | 770 DeactivateIncrementalWriteBarrier(); |
769 DCHECK(heap_->mark_compact_collector()->marking_deque()->IsEmpty()); | 771 DCHECK(heap_->mark_compact_collector()->marking_deque()->IsEmpty()); |
770 heap_->isolate()->stack_guard()->ClearGC(); | 772 heap_->isolate()->stack_guard()->ClearGC(); |
771 } | 773 } |
772 | 774 |
773 | 775 |
| 776 void IncrementalMarking::OverApproximateWeakClosure() { |
| 777 DCHECK(FLAG_overapproximate_weak_closure); |
| 778 DCHECK(!weak_closure_was_overapproximated_); |
| 779 if (FLAG_trace_incremental_marking) { |
| 780 PrintF("[IncrementalMarking] requesting weak closure overapproximation.\n"); |
| 781 } |
| 782 set_should_hurry(true); |
| 783 request_type_ = OVERAPPROXIMATION; |
| 784 heap_->isolate()->stack_guard()->RequestGC(); |
| 785 } |
| 786 |
| 787 |
774 void IncrementalMarking::MarkingComplete(CompletionAction action) { | 788 void IncrementalMarking::MarkingComplete(CompletionAction action) { |
775 state_ = COMPLETE; | 789 state_ = COMPLETE; |
776 // We will set the stack guard to request a GC now. This will mean the rest | 790 // We will set the stack guard to request a GC now. This will mean the rest |
777 // of the GC gets performed as soon as possible (we can't do a GC here in a | 791 // of the GC gets performed as soon as possible (we can't do a GC here in a |
778 // record-write context). If a few things get allocated between now and then | 792 // record-write context). If a few things get allocated between now and then |
779 // that shouldn't make us do a scavenge and keep being incremental, so we set | 793 // that shouldn't make us do a scavenge and keep being incremental, so we set |
780 // the should-hurry flag to indicate that there can't be much work left to do. | 794 // the should-hurry flag to indicate that there can't be much work left to do. |
781 set_should_hurry(true); | 795 set_should_hurry(true); |
782 if (FLAG_trace_incremental_marking) { | 796 if (FLAG_trace_incremental_marking) { |
783 PrintF("[IncrementalMarking] Complete (normal).\n"); | 797 PrintF("[IncrementalMarking] Complete (normal).\n"); |
784 } | 798 } |
785 if (action == GC_VIA_STACK_GUARD) { | 799 if (action == GC_VIA_STACK_GUARD) { |
| 800 request_type_ = COMPLETE_MARKING; |
786 heap_->isolate()->stack_guard()->RequestGC(); | 801 heap_->isolate()->stack_guard()->RequestGC(); |
787 } | 802 } |
788 } | 803 } |
789 | 804 |
790 | 805 |
791 void IncrementalMarking::Epilogue() { was_activated_ = false; } | 806 void IncrementalMarking::Epilogue() { |
| 807 was_activated_ = false; |
| 808 weak_closure_was_overapproximated_ = false; |
| 809 } |
792 | 810 |
793 | 811 |
794 void IncrementalMarking::OldSpaceStep(intptr_t allocated) { | 812 void IncrementalMarking::OldSpaceStep(intptr_t allocated) { |
795 if (IsStopped() && ShouldActivate()) { | 813 if (IsStopped() && ShouldActivate()) { |
796 // TODO(hpayer): Let's play safe for now, but compaction should be | 814 // TODO(hpayer): Let's play safe for now, but compaction should be |
797 // in principle possible. | 815 // in principle possible. |
798 Start(PREVENT_COMPACTION); | 816 Start(PREVENT_COMPACTION); |
799 } else { | 817 } else { |
800 Step(allocated * kFastMarking / kInitialMarkingSpeed, GC_VIA_STACK_GUARD); | 818 Step(allocated * kFastMarking / kInitialMarkingSpeed, GC_VIA_STACK_GUARD); |
801 } | 819 } |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
924 } | 942 } |
925 if (!heap_->mark_compact_collector()->sweeping_in_progress()) { | 943 if (!heap_->mark_compact_collector()->sweeping_in_progress()) { |
926 bytes_scanned_ = 0; | 944 bytes_scanned_ = 0; |
927 StartMarking(PREVENT_COMPACTION); | 945 StartMarking(PREVENT_COMPACTION); |
928 } | 946 } |
929 } else if (state_ == MARKING) { | 947 } else if (state_ == MARKING) { |
930 bytes_processed = ProcessMarkingDeque(bytes_to_process); | 948 bytes_processed = ProcessMarkingDeque(bytes_to_process); |
931 if (heap_->mark_compact_collector()->marking_deque()->IsEmpty()) { | 949 if (heap_->mark_compact_collector()->marking_deque()->IsEmpty()) { |
932 if (completion == FORCE_COMPLETION || | 950 if (completion == FORCE_COMPLETION || |
933 IsIdleMarkingDelayCounterLimitReached()) { | 951 IsIdleMarkingDelayCounterLimitReached()) { |
934 MarkingComplete(action); | 952 if (FLAG_overapproximate_weak_closure && |
| 953 !weak_closure_was_overapproximated_ && |
| 954 action == GC_VIA_STACK_GUARD) { |
| 955 OverApproximateWeakClosure(); |
| 956 } else { |
| 957 MarkingComplete(action); |
| 958 } |
935 } else { | 959 } else { |
936 IncrementIdleMarkingDelayCounter(); | 960 IncrementIdleMarkingDelayCounter(); |
937 } | 961 } |
938 } | 962 } |
939 } | 963 } |
940 | 964 |
941 steps_count_++; | 965 steps_count_++; |
942 | 966 |
943 // Speed up marking if we are marking too slow or if we are almost done | 967 // Speed up marking if we are marking too slow or if we are almost done |
944 // with marking. | 968 // with marking. |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
981 void IncrementalMarking::IncrementIdleMarkingDelayCounter() { | 1005 void IncrementalMarking::IncrementIdleMarkingDelayCounter() { |
982 idle_marking_delay_counter_++; | 1006 idle_marking_delay_counter_++; |
983 } | 1007 } |
984 | 1008 |
985 | 1009 |
986 void IncrementalMarking::ClearIdleMarkingDelayCounter() { | 1010 void IncrementalMarking::ClearIdleMarkingDelayCounter() { |
987 idle_marking_delay_counter_ = 0; | 1011 idle_marking_delay_counter_ = 0; |
988 } | 1012 } |
989 } | 1013 } |
990 } // namespace v8::internal | 1014 } // namespace v8::internal |
OLD | NEW |