Index: content/renderer/render_thread_impl.cc |
diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc |
index c7ea9c71e78c6fcd3727d6326465f816285e075e..b8e2372c79cc8b6098f800bea8bfd9955b6c4c5b 100644 |
--- a/content/renderer/render_thread_impl.cc |
+++ b/content/renderer/render_thread_impl.cc |
@@ -953,6 +953,9 @@ void RenderThreadImpl::IdleHandler() { |
if (!v8::V8::IdleNotification()) { |
continue_timer = true; |
} |
+ if (!base::DiscardableMemory::ReduceMemoryUsage()) { |
+ continue_timer = true; |
+ } |
// Schedule next invocation. |
// Dampen the delay using the algorithm (if delay is in seconds): |
@@ -994,10 +997,17 @@ void RenderThreadImpl::IdleHandlerInForegroundTab() { |
int idle_hint = static_cast<int>(new_delay_ms / 10); |
if (cpu_usage < kIdleCPUUsageThresholdInPercents) { |
base::allocator::ReleaseFreeMemory(); |
- if (v8::V8::IdleNotification(idle_hint)) { |
- // V8 finished collecting garbage. |
+ |
+ bool finished_idle_work = true; |
+ if (!v8::V8::IdleNotification(idle_hint)) |
+ finished_idle_work = false; |
+ if (!base::DiscardableMemory::ReduceMemoryUsage()) |
+ finished_idle_work = false; |
+ |
+ // V8 finished collecting garbage and discardable memory system has no |
+ // more idle work left. |
+ if (finished_idle_work) |
new_delay_ms = kLongIdleHandlerDelayMs; |
- } |
} |
} |
ScheduleIdleHandler(new_delay_ms); |