Chromium Code Reviews| Index: src/heap/heap.cc |
| diff --git a/src/heap/heap.cc b/src/heap/heap.cc |
| index 6a4acda903ed8cb6e7a95288b041f79197114b81..b75b97cbcd454bcff2eede0a323303700c4b1427 100644 |
| --- a/src/heap/heap.cc |
| +++ b/src/heap/heap.cc |
| @@ -769,7 +769,8 @@ void Heap::PreprocessStackTraces() { |
| void Heap::HandleGCRequest() { |
| if (incremental_marking()->request_type() == |
| IncrementalMarking::COMPLETE_MARKING) { |
| - CollectAllGarbage(Heap::kNoGCFlags, "GC interrupt"); |
| + CollectAllGarbage(Heap::kNoGCFlags, "GC interrupt", |
| + incremental_marking()->CallbackFlags()); |
| return; |
| } |
| DCHECK(FLAG_overapproximate_weak_closure); |
| @@ -1006,9 +1007,17 @@ int Heap::NotifyContextDisposed(bool dependant_context) { |
| } |
| +void Heap::StartIncrementalMarking(int gc_flags, |
| + const GCCallbackFlags gc_callback_flags, |
| + const char* reason) { |
| + incremental_marking()->Start(gc_flags, gc_callback_flags, reason); |
| +} |
| + |
| + |
| void Heap::StartIdleIncrementalMarking() { |
| gc_idle_time_handler_.ResetNoProgressCounter(); |
| - incremental_marking()->Start(kReduceMemoryFootprintMask); |
| + StartIncrementalMarking(kReduceMemoryFootprintMask, kNoGCCallbackFlags, |
| + "idle"); |
| } |
| @@ -4790,13 +4799,21 @@ GCIdleTimeHandler::HeapState Heap::ComputeHeapState() { |
| double Heap::AdvanceIncrementalMarking( |
| intptr_t step_size_in_bytes, double deadline_in_ms, |
| - IncrementalMarking::ForceCompletionAction completion) { |
| + IncrementalMarking::StepActions step_actions) { |
| DCHECK(!incremental_marking()->IsStopped()); |
| + |
| + if (step_size_in_bytes == 0) { |
| + GCIdleTimeHandler::HeapState heap_state = ComputeHeapState(); |
|
Hannes Payer (out of office)
2015/08/04 15:05:59
You don't need the heap_state for that. Just call
Michael Lippautz
2015/08/04 15:53:06
Done.
|
| + step_size_in_bytes = GCIdleTimeHandler::EstimateMarkingStepSize( |
| + static_cast<size_t>(GCIdleTimeHandler::kIncrementalMarkingStepTimeInMs), |
| + heap_state.incremental_marking_speed_in_bytes_per_ms); |
| + } |
| + |
| double remaining_time_in_ms = 0.0; |
| do { |
| - incremental_marking()->Step(step_size_in_bytes, |
| - IncrementalMarking::NO_GC_VIA_STACK_GUARD, |
| - IncrementalMarking::FORCE_MARKING, completion); |
| + incremental_marking()->Step( |
| + step_size_in_bytes, step_actions.completion_action, |
| + step_actions.force_marking, step_actions.force_completion); |
| remaining_time_in_ms = deadline_in_ms - MonotonicallyIncreasingTimeInMs(); |
| } while (remaining_time_in_ms >= |
| 2.0 * GCIdleTimeHandler::kIncrementalMarkingStepTimeInMs && |
| @@ -4815,9 +4832,9 @@ bool Heap::PerformIdleTimeAction(GCIdleTimeAction action, |
| result = true; |
| break; |
| case DO_INCREMENTAL_MARKING: { |
| - const double remaining_idle_time_in_ms = AdvanceIncrementalMarking( |
| - action.parameter, deadline_in_ms, |
| - IncrementalMarking::DO_NOT_FORCE_COMPLETION); |
| + const double remaining_idle_time_in_ms = |
| + AdvanceIncrementalMarking(action.parameter, deadline_in_ms, |
| + IncrementalMarking::NoForcedStepActions()); |
| if (remaining_idle_time_in_ms > 0.0) { |
| action.additional_work = TryFinalizeIdleIncrementalMarking( |
| remaining_idle_time_in_ms, heap_state.size_of_objects, |