| Index: src/incremental-marking.cc
|
| diff --git a/src/incremental-marking.cc b/src/incremental-marking.cc
|
| index 0ab9a002452e94aa7846816d14c73e9c4f349b7e..6526577d3efc1d4490d0a2340f8daaa7a70cd210 100644
|
| --- a/src/incremental-marking.cc
|
| +++ b/src/incremental-marking.cc
|
| @@ -677,9 +677,10 @@ void IncrementalMarking::VisitObject(Map* map, HeapObject* obj, int size) {
|
| }
|
|
|
|
|
| -void IncrementalMarking::ProcessMarkingDeque(intptr_t bytes_to_process) {
|
| +intptr_t IncrementalMarking::ProcessMarkingDeque(intptr_t bytes_to_process) {
|
| + intptr_t bytes_processed = 0;
|
| Map* filler_map = heap_->one_pointer_filler_map();
|
| - while (!marking_deque_.IsEmpty() && bytes_to_process > 0) {
|
| + while (!marking_deque_.IsEmpty() && bytes_processed < bytes_to_process) {
|
| HeapObject* obj = marking_deque_.Pop();
|
|
|
| // Explicitly skip one word fillers. Incremental markbit patterns are
|
| @@ -693,8 +694,9 @@ void IncrementalMarking::ProcessMarkingDeque(intptr_t bytes_to_process) {
|
| int delta = (size - unscanned_bytes_of_large_object_);
|
| // TODO(jochen): remove after http://crbug.com/381820 is resolved.
|
| CHECK_LT(0, delta);
|
| - bytes_to_process -= delta;
|
| + bytes_processed += delta;
|
| }
|
| + return bytes_processed;
|
| }
|
|
|
|
|
| @@ -873,6 +875,7 @@ void IncrementalMarking::Step(intptr_t allocated_bytes,
|
| write_barriers_invoked_since_last_step_ = 0;
|
|
|
| bytes_scanned_ += bytes_to_process;
|
| + intptr_t bytes_processed = 0;
|
|
|
| if (state_ == SWEEPING) {
|
| if (heap_->mark_compact_collector()->sweeping_in_progress() &&
|
| @@ -884,7 +887,7 @@ void IncrementalMarking::Step(intptr_t allocated_bytes,
|
| StartMarking(PREVENT_COMPACTION);
|
| }
|
| } else if (state_ == MARKING) {
|
| - ProcessMarkingDeque(bytes_to_process);
|
| + bytes_processed = ProcessMarkingDeque(bytes_to_process);
|
| if (marking_deque_.IsEmpty()) MarkingComplete(action);
|
| }
|
|
|
| @@ -956,7 +959,10 @@ void IncrementalMarking::Step(intptr_t allocated_bytes,
|
|
|
| double end = base::OS::TimeCurrentMillis();
|
| double duration = (end - start);
|
| - heap_->tracer()->AddIncrementalMarkingStep(duration, allocated_bytes);
|
| + // Note that we report zero bytes here when sweeping was in progress or
|
| + // when we just started incremental marking. In these cases we did not
|
| + // process the marking deque.
|
| + heap_->tracer()->AddIncrementalMarkingStep(duration, bytes_processed);
|
| heap_->AddMarkingTime(duration);
|
| }
|
| }
|
|
|