Chromium Code Reviews| Index: src/heap/heap.cc |
| diff --git a/src/heap/heap.cc b/src/heap/heap.cc |
| index 715e7ba300cca4d052c205c72acdd44ca0752e3a..a29992c72ac3dfebe77e0d968b096bc2d3900632 100644 |
| --- a/src/heap/heap.cc |
| +++ b/src/heap/heap.cc |
| @@ -4392,10 +4392,17 @@ bool Heap::WorthActivatingIncrementalMarking() { |
| bool Heap::IdleNotification(int idle_time_in_ms) { |
| - base::ElapsedTimer timer; |
| - timer.Start(); |
| - isolate()->counters()->gc_idle_time_allotted_in_ms()->AddSample( |
| - idle_time_in_ms); |
| + return IdleNotification( |
| + V8::GetCurrentPlatform()->MonotonicallyIncreasingTime() + |
| + (static_cast<double>(idle_time_in_ms) / |
| + static_cast<double>(base::Time::kMillisecondsPerSecond))); |
| +} |
| + |
| + |
| +bool Heap::IdleNotification(double deadline_in_seconds) { |
| + double deadline_in_ms = |
| + deadline_in_seconds * |
| + static_cast<double>(base::Time::kMillisecondsPerSecond); |
| HistogramTimerScope idle_notification_scope( |
| isolate_->counters()->gc_idle_notification()); |
| @@ -4425,11 +4432,16 @@ bool Heap::IdleNotification(int idle_time_in_ms) { |
| static_cast<size_t>( |
| tracer()->NewSpaceAllocationThroughputInBytesPerMillisecond()); |
| + double idle_time_in_ms = |
| + deadline_in_ms - |
| + (V8::GetCurrentPlatform()->MonotonicallyIncreasingTime() * |
| + static_cast<double>(base::Time::kMillisecondsPerSecond)); |
| GCIdleTimeAction action = |
| gc_idle_time_handler_.Compute(idle_time_in_ms, heap_state); |
| + isolate()->counters()->gc_idle_time_allotted_in_ms()->AddSample( |
| + static_cast<int>(idle_time_in_ms)); |
| bool result = false; |
| - int actual_time_in_ms = 0; |
| switch (action.type) { |
| case DONE: |
| result = true; |
| @@ -4442,11 +4454,14 @@ bool Heap::IdleNotification(int idle_time_in_ms) { |
| IncrementalMarking::NO_GC_VIA_STACK_GUARD, |
| IncrementalMarking::FORCE_MARKING, |
| IncrementalMarking::DO_NOT_FORCE_COMPLETION); |
| - actual_time_in_ms = static_cast<int>(timer.Elapsed().InMilliseconds()); |
| - int remaining_idle_time_in_ms = idle_time_in_ms - actual_time_in_ms; |
| - if (remaining_idle_time_in_ms > 0) { |
| + double remaining_idle_time_in_ms = |
| + deadline_in_ms - |
| + (V8::GetCurrentPlatform()->MonotonicallyIncreasingTime() * |
| + static_cast<double>(base::Time::kMillisecondsPerSecond)); |
|
rmcilroy
2014/11/26 11:35:41
nit - would be good to have a helper for Monotonic
Hannes Payer (out of office)
2014/11/27 12:19:15
Done.
|
| + if (remaining_idle_time_in_ms > 0.0) { |
| TryFinalizeIdleIncrementalMarking( |
| - remaining_idle_time_in_ms, heap_state.size_of_objects, |
| + static_cast<size_t>(remaining_idle_time_in_ms), |
| + heap_state.size_of_objects, |
| heap_state.final_incremental_mark_compact_speed_in_bytes_per_ms); |
| } |
| break; |
| @@ -4472,20 +4487,26 @@ bool Heap::IdleNotification(int idle_time_in_ms) { |
| break; |
| } |
| - actual_time_in_ms = static_cast<int>(timer.Elapsed().InMilliseconds()); |
| - if (actual_time_in_ms <= idle_time_in_ms) { |
| + |
| + double deadline_difference = |
| + deadline_in_ms - |
| + (V8::GetCurrentPlatform()->MonotonicallyIncreasingTime() * |
| + static_cast<double>(base::Time::kMillisecondsPerSecond)); |
| + if (deadline_difference >= 0) { |
| if (action.type != DONE && action.type != DO_NOTHING) { |
| isolate()->counters()->gc_idle_time_limit_undershot()->AddSample( |
| - idle_time_in_ms - actual_time_in_ms); |
| + static_cast<int>(deadline_difference)); |
| } |
| } else { |
| isolate()->counters()->gc_idle_time_limit_overshot()->AddSample( |
| - actual_time_in_ms - idle_time_in_ms); |
| + static_cast<int>(-deadline_difference)); |
| } |
| if (FLAG_trace_idle_notification) { |
| - PrintF("Idle notification: requested idle time %d ms, actual time %d ms [", |
| - idle_time_in_ms, actual_time_in_ms); |
| + PrintF( |
| + "Idle notification: requested idle time %.2f ms, deadline difference " |
| + "%.2f ms [", |
| + idle_time_in_ms, deadline_difference); |
| action.Print(); |
| PrintF("]"); |
| if (FLAG_trace_idle_notification_verbose) { |