| Index: src/heap/incremental-marking.cc
 | 
| diff --git a/src/heap/incremental-marking.cc b/src/heap/incremental-marking.cc
 | 
| index d72423a60aa81619516404c2995ebc26df4e60a2..b38d85906ac426f9463a5593827851ba85ff39dc 100644
 | 
| --- a/src/heap/incremental-marking.cc
 | 
| +++ b/src/heap/incremental-marking.cc
 | 
| @@ -27,6 +27,7 @@ IncrementalMarking::IncrementalMarking(Heap* heap)
 | 
|        should_hurry_(false),
 | 
|        marking_speed_(0),
 | 
|        allocated_(0),
 | 
| +      idle_marking_delay_counter_(0),
 | 
|        no_marking_scope_depth_(0),
 | 
|        unscanned_bytes_of_large_object_(0) {}
 | 
|  
 | 
| @@ -892,24 +893,27 @@ void IncrementalMarking::SpeedUp() {
 | 
|  }
 | 
|  
 | 
|  
 | 
| -void IncrementalMarking::Step(intptr_t allocated_bytes, CompletionAction action,
 | 
| -                              bool force_marking) {
 | 
| +intptr_t IncrementalMarking::Step(intptr_t allocated_bytes,
 | 
| +                                  CompletionAction action,
 | 
| +                                  ForceMarkingAction marking,
 | 
| +                                  ForceCompletionAction completion) {
 | 
|    if (heap_->gc_state() != Heap::NOT_IN_GC || !FLAG_incremental_marking ||
 | 
|        !FLAG_incremental_marking_steps ||
 | 
|        (state_ != SWEEPING && state_ != MARKING)) {
 | 
| -    return;
 | 
| +    return 0;
 | 
|    }
 | 
|  
 | 
|    allocated_ += allocated_bytes;
 | 
|  
 | 
| -  if (!force_marking && allocated_ < kAllocatedThreshold &&
 | 
| +  if (marking == DO_NOT_FORCE_MARKING && allocated_ < kAllocatedThreshold &&
 | 
|        write_barriers_invoked_since_last_step_ <
 | 
|            kWriteBarriersInvokedThreshold) {
 | 
| -    return;
 | 
| +    return 0;
 | 
|    }
 | 
|  
 | 
| -  if (state_ == MARKING && no_marking_scope_depth_ > 0) return;
 | 
| +  if (state_ == MARKING && no_marking_scope_depth_ > 0) return 0;
 | 
|  
 | 
| +  intptr_t bytes_processed = 0;
 | 
|    {
 | 
|      HistogramTimerScope incremental_marking_scope(
 | 
|          heap_->isolate()->counters()->gc_incremental_marking());
 | 
| @@ -930,7 +934,6 @@ void IncrementalMarking::Step(intptr_t allocated_bytes, CompletionAction action,
 | 
|      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() &&
 | 
| @@ -943,7 +946,14 @@ void IncrementalMarking::Step(intptr_t allocated_bytes, CompletionAction action,
 | 
|        }
 | 
|      } else if (state_ == MARKING) {
 | 
|        bytes_processed = ProcessMarkingDeque(bytes_to_process);
 | 
| -      if (marking_deque_.IsEmpty()) MarkingComplete(action);
 | 
| +      if (marking_deque_.IsEmpty()) {
 | 
| +        if (completion == FORCE_COMPLETION ||
 | 
| +            IsIdleMarkingDelayCounterLimitReached()) {
 | 
| +          MarkingComplete(action);
 | 
| +        } else {
 | 
| +          IncrementIdleMarkingDelayCounter();
 | 
| +        }
 | 
| +      }
 | 
|      }
 | 
|  
 | 
|      steps_count_++;
 | 
| @@ -959,6 +969,7 @@ void IncrementalMarking::Step(intptr_t allocated_bytes, CompletionAction action,
 | 
|      // process the marking deque.
 | 
|      heap_->tracer()->AddIncrementalMarkingStep(duration, bytes_processed);
 | 
|    }
 | 
| +  return bytes_processed;
 | 
|  }
 | 
|  
 | 
|  
 | 
| @@ -978,5 +989,20 @@ void IncrementalMarking::ResetStepCounters() {
 | 
|  int64_t IncrementalMarking::SpaceLeftInOldSpace() {
 | 
|    return heap_->MaxOldGenerationSize() - heap_->PromotedSpaceSizeOfObjects();
 | 
|  }
 | 
| +
 | 
| +
 | 
| +bool IncrementalMarking::IsIdleMarkingDelayCounterLimitReached() {
 | 
| +  return idle_marking_delay_counter_ > kMaxIdleMarkingDelayCounter;
 | 
| +}
 | 
| +
 | 
| +
 | 
| +void IncrementalMarking::IncrementIdleMarkingDelayCounter() {
 | 
| +  idle_marking_delay_counter_++;
 | 
| +}
 | 
| +
 | 
| +
 | 
| +void IncrementalMarking::ClearIdleMarkingDelayCounter() {
 | 
| +  idle_marking_delay_counter_ = 0;
 | 
| +}
 | 
|  }
 | 
|  }  // namespace v8::internal
 | 
| 
 |