Chromium Code Reviews| Index: src/heap/incremental-marking.cc |
| diff --git a/src/heap/incremental-marking.cc b/src/heap/incremental-marking.cc |
| index 4c671c9a2f5c70d3befb2e13ed52bc3b84bce136..359b9207a3a869ea3760df7d1e7ab2451346a792 100644 |
| --- a/src/heap/incremental-marking.cc |
| +++ b/src/heap/incremental-marking.cc |
| @@ -551,10 +551,6 @@ void IncrementalMarking::StartMarking() { |
| if (FLAG_concurrent_marking) { |
| ConcurrentMarking* concurrent_marking = heap_->concurrent_marking(); |
| - heap_->mark_compact_collector()->marking_deque()->Iterate( |
| - [concurrent_marking](HeapObject* obj) { |
| - concurrent_marking->AddRoot(obj); |
| - }); |
| concurrent_marking->StartTask(); |
| } |
| @@ -712,9 +708,6 @@ void IncrementalMarking::FinalizeIncrementally() { |
| double start = heap_->MonotonicallyIncreasingTimeInMs(); |
| - int old_marking_deque_top = |
| - heap_->mark_compact_collector()->marking_deque()->top(); |
| - |
| // After finishing incremental marking, we try to discover all unmarked |
| // objects to reduce the marking load in the final pause. |
| // 1) We scan and mark the roots again to find all changes to the root set. |
| @@ -731,11 +724,9 @@ void IncrementalMarking::FinalizeIncrementally() { |
| ProcessWeakCells(); |
| int marking_progress = |
| - abs(old_marking_deque_top - |
| - heap_->mark_compact_collector()->marking_deque()->top()); |
| - |
| - marking_progress += static_cast<int>( |
| - heap_->local_embedder_heap_tracer()->NumberOfCachedWrappersToTrace()); |
| + heap_->mark_compact_collector()->marking_deque()->Size() + |
|
ulan
2017/04/27 17:49:39
This changes behavior.
|
| + static_cast<int>( |
| + heap_->local_embedder_heap_tracer()->NumberOfCachedWrappersToTrace()); |
| double end = heap_->MonotonicallyIncreasingTimeInMs(); |
| double delta = end - start; |
| @@ -769,52 +760,40 @@ void IncrementalMarking::UpdateMarkingDequeAfterScavenge() { |
| MarkingDeque* marking_deque = |
| heap_->mark_compact_collector()->marking_deque(); |
| - int current = marking_deque->bottom(); |
|
ulan
2017/04/27 17:49:39
We no longer can assume contiguous structure of th
|
| - int mask = marking_deque->mask(); |
| - int limit = marking_deque->top(); |
| - HeapObject** array = marking_deque->array(); |
| - int new_top = current; |
| - |
| Map* filler_map = heap_->one_pointer_filler_map(); |
| - |
| - while (current != limit) { |
| - HeapObject* obj = array[current]; |
| + Heap* heap = heap_; |
| + marking_deque->Update([heap, filler_map](HeapObject* obj) -> HeapObject* { |
| DCHECK(obj->IsHeapObject()); |
| - current = ((current + 1) & mask); |
| // Only pointers to from space have to be updated. |
| - if (heap_->InFromSpace(obj)) { |
| + if (heap->InFromSpace(obj)) { |
| MapWord map_word = obj->map_word(); |
| // There may be objects on the marking deque that do not exist anymore, |
| // e.g. left trimmed objects or objects from the root set (frames). |
| // If these object are dead at scavenging time, their marking deque |
| // entries will not point to forwarding addresses. Hence, we can discard |
| // them. |
| - if (map_word.IsForwardingAddress()) { |
| - HeapObject* dest = map_word.ToForwardingAddress(); |
| - if (ObjectMarking::IsBlack(dest, MarkingState::Internal(dest))) |
| - continue; |
| - array[new_top] = dest; |
| - new_top = ((new_top + 1) & mask); |
| - DCHECK(new_top != marking_deque->bottom()); |
| - DCHECK(ObjectMarking::IsGrey(obj, MarkingState::Internal(obj)) || |
| - (obj->IsFiller() && |
| - ObjectMarking::IsWhite(obj, MarkingState::Internal(obj)))); |
| + if (!map_word.IsForwardingAddress()) return nullptr; |
| + HeapObject* dest = map_word.ToForwardingAddress(); |
| + if (ObjectMarking::IsBlack(dest, MarkingState::Internal(dest))) { |
| + // The object is already processed by the marker. |
| + return nullptr; |
| } |
| - } else if (obj->map() != filler_map) { |
| + DCHECK(ObjectMarking::IsGrey(obj, MarkingState::Internal(obj)) || |
| + (obj->IsFiller() && |
| + ObjectMarking::IsWhite(obj, MarkingState::Internal(obj)))); |
| + return dest; |
| + } else { |
| // Skip one word filler objects that appear on the |
| // stack when we perform in place array shift. |
| - array[new_top] = obj; |
| - new_top = ((new_top + 1) & mask); |
| - DCHECK(new_top != marking_deque->bottom()); |
| DCHECK(ObjectMarking::IsGrey(obj, MarkingState::Internal(obj)) || |
| (obj->IsFiller() && |
| ObjectMarking::IsWhite(obj, MarkingState::Internal(obj))) || |
| (MemoryChunk::FromAddress(obj->address()) |
| ->IsFlagSet(MemoryChunk::HAS_PROGRESS_BAR) && |
| ObjectMarking::IsBlack(obj, MarkingState::Internal(obj)))); |
| + return (obj->map() == filler_map) ? nullptr : obj; |
| } |
| - } |
| - marking_deque->set_top(new_top); |
| + }); |
| } |