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-idle-time-handler.h" | 10 #include "src/heap/gc-idle-time-handler.h" |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
129 if (obj->IsHeapObject()) { | 129 if (obj->IsHeapObject()) { |
130 HeapObject* heap_obj = HeapObject::cast(obj); | 130 HeapObject* heap_obj = HeapObject::cast(obj); |
131 MarkBit mark_bit = ObjectMarking::MarkBitFrom(HeapObject::cast(obj)); | 131 MarkBit mark_bit = ObjectMarking::MarkBitFrom(HeapObject::cast(obj)); |
132 if (Marking::IsBlack(mark_bit)) { | 132 if (Marking::IsBlack(mark_bit)) { |
133 MemoryChunk::IncrementLiveBytes(heap_obj, -heap_obj->Size()); | 133 MemoryChunk::IncrementLiveBytes(heap_obj, -heap_obj->Size()); |
134 } | 134 } |
135 Marking::AnyToGrey(mark_bit); | 135 Marking::AnyToGrey(mark_bit); |
136 } | 136 } |
137 } | 137 } |
138 | 138 |
139 void IncrementalMarking::TransferMark(Heap* heap, Address old_start, | 139 void IncrementalMarking::TransferMark(Heap* heap, HeapObject* from, |
140 Address new_start) { | 140 HeapObject* to) { |
141 // This is only used when resizing an object. | 141 // This is only used when resizing an object. |
142 DCHECK(MemoryChunk::FromAddress(old_start) == | 142 DCHECK(MemoryChunk::FromAddress(from->address()) == |
143 MemoryChunk::FromAddress(new_start)); | 143 MemoryChunk::FromAddress(to->address())); |
144 | 144 |
145 if (!heap->incremental_marking()->IsMarking()) return; | 145 if (!heap->incremental_marking()->IsMarking()) return; |
146 | 146 |
147 // If the mark doesn't move, we don't check the color of the object. | 147 // If the mark doesn't move, we don't check the color of the object. |
148 // It doesn't matter whether the object is black, since it hasn't changed | 148 // It doesn't matter whether the object is black, since it hasn't changed |
149 // size, so the adjustment to the live data count will be zero anyway. | 149 // size, so the adjustment to the live data count will be zero anyway. |
150 if (old_start == new_start) return; | 150 if (from == to) return; |
151 | 151 |
152 MarkBit new_mark_bit = ObjectMarking::MarkBitFrom(new_start); | 152 MarkBit new_mark_bit = ObjectMarking::MarkBitFrom(to); |
153 MarkBit old_mark_bit = ObjectMarking::MarkBitFrom(old_start); | 153 MarkBit old_mark_bit = ObjectMarking::MarkBitFrom(from); |
154 | 154 |
155 #ifdef DEBUG | 155 #ifdef DEBUG |
156 Marking::ObjectColor old_color = Marking::Color(old_mark_bit); | 156 Marking::ObjectColor old_color = Marking::Color(old_mark_bit); |
157 #endif | 157 #endif |
158 | 158 |
159 if (Marking::IsBlack(old_mark_bit)) { | 159 if (Marking::IsBlack(old_mark_bit)) { |
160 Marking::BlackToWhite(old_mark_bit); | 160 Marking::BlackToWhite(old_mark_bit); |
161 Marking::MarkBlack(new_mark_bit); | 161 Marking::MarkBlack(new_mark_bit); |
162 return; | 162 return; |
163 } else if (Marking::IsGrey(old_mark_bit)) { | 163 } else if (Marking::IsGrey(old_mark_bit)) { |
164 Marking::GreyToWhite(old_mark_bit); | 164 Marking::GreyToWhite(old_mark_bit); |
165 heap->incremental_marking()->WhiteToGreyAndPush( | 165 heap->incremental_marking()->WhiteToGreyAndPush(to, new_mark_bit); |
166 HeapObject::FromAddress(new_start), new_mark_bit); | |
167 heap->incremental_marking()->RestartIfNotMarking(); | 166 heap->incremental_marking()->RestartIfNotMarking(); |
168 } | 167 } |
169 | 168 |
170 #ifdef DEBUG | 169 #ifdef DEBUG |
171 Marking::ObjectColor new_color = Marking::Color(new_mark_bit); | 170 Marking::ObjectColor new_color = Marking::Color(new_mark_bit); |
172 DCHECK(new_color == old_color); | 171 DCHECK(new_color == old_color); |
173 #endif | 172 #endif |
174 } | 173 } |
175 | 174 |
176 class IncrementalMarkingMarkingVisitor | 175 class IncrementalMarkingMarkingVisitor |
(...skipping 624 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
801 // Only pointers to from space have to be updated. | 800 // Only pointers to from space have to be updated. |
802 if (heap_->InFromSpace(obj)) { | 801 if (heap_->InFromSpace(obj)) { |
803 MapWord map_word = obj->map_word(); | 802 MapWord map_word = obj->map_word(); |
804 // There may be objects on the marking deque that do not exist anymore, | 803 // There may be objects on the marking deque that do not exist anymore, |
805 // e.g. left trimmed objects or objects from the root set (frames). | 804 // e.g. left trimmed objects or objects from the root set (frames). |
806 // If these object are dead at scavenging time, their marking deque | 805 // If these object are dead at scavenging time, their marking deque |
807 // entries will not point to forwarding addresses. Hence, we can discard | 806 // entries will not point to forwarding addresses. Hence, we can discard |
808 // them. | 807 // them. |
809 if (map_word.IsForwardingAddress()) { | 808 if (map_word.IsForwardingAddress()) { |
810 HeapObject* dest = map_word.ToForwardingAddress(); | 809 HeapObject* dest = map_word.ToForwardingAddress(); |
811 if (Marking::IsBlack(ObjectMarking::MarkBitFrom(dest->address()))) | 810 if (Marking::IsBlack(ObjectMarking::MarkBitFrom(dest))) continue; |
812 continue; | |
813 array[new_top] = dest; | 811 array[new_top] = dest; |
814 new_top = ((new_top + 1) & mask); | 812 new_top = ((new_top + 1) & mask); |
815 DCHECK(new_top != marking_deque->bottom()); | 813 DCHECK(new_top != marking_deque->bottom()); |
816 #ifdef DEBUG | 814 #ifdef DEBUG |
817 MarkBit mark_bit = ObjectMarking::MarkBitFrom(obj); | 815 MarkBit mark_bit = ObjectMarking::MarkBitFrom(obj); |
818 DCHECK(Marking::IsGrey(mark_bit) || | 816 DCHECK(Marking::IsGrey(mark_bit) || |
819 (obj->IsFiller() && Marking::IsWhite(mark_bit))); | 817 (obj->IsFiller() && Marking::IsWhite(mark_bit))); |
820 #endif | 818 #endif |
821 } | 819 } |
822 } else if (obj->map() != filler_map) { | 820 } else if (obj->map() != filler_map) { |
(...skipping 391 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1214 idle_marking_delay_counter_++; | 1212 idle_marking_delay_counter_++; |
1215 } | 1213 } |
1216 | 1214 |
1217 | 1215 |
1218 void IncrementalMarking::ClearIdleMarkingDelayCounter() { | 1216 void IncrementalMarking::ClearIdleMarkingDelayCounter() { |
1219 idle_marking_delay_counter_ = 0; | 1217 idle_marking_delay_counter_ = 0; |
1220 } | 1218 } |
1221 | 1219 |
1222 } // namespace internal | 1220 } // namespace internal |
1223 } // namespace v8 | 1221 } // namespace v8 |
OLD | NEW |