| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/renderer/render_thread_impl.h" | 5 #include "content/renderer/render_thread_impl.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <limits> | 8 #include <limits> |
| 9 #include <map> | 9 #include <map> |
| 10 #include <vector> | 10 #include <vector> |
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 166 using blink::WebScriptController; | 166 using blink::WebScriptController; |
| 167 using blink::WebSecurityPolicy; | 167 using blink::WebSecurityPolicy; |
| 168 using blink::WebString; | 168 using blink::WebString; |
| 169 using blink::WebView; | 169 using blink::WebView; |
| 170 | 170 |
| 171 namespace content { | 171 namespace content { |
| 172 | 172 |
| 173 namespace { | 173 namespace { |
| 174 | 174 |
| 175 const int64 kInitialIdleHandlerDelayMs = 1000; | 175 const int64 kInitialIdleHandlerDelayMs = 1000; |
| 176 const int64 kShortIdleHandlerDelayMs = 1000; | |
| 177 const int64 kLongIdleHandlerDelayMs = 30*1000; | 176 const int64 kLongIdleHandlerDelayMs = 30*1000; |
| 178 const int kIdleCPUUsageThresholdInPercents = 3; | |
| 179 | 177 |
| 180 // Maximum allocation size allowed for image scaling filters that | 178 // Maximum allocation size allowed for image scaling filters that |
| 181 // require pre-scaling. Skia will fallback to a filter that doesn't | 179 // require pre-scaling. Skia will fallback to a filter that doesn't |
| 182 // require pre-scaling if the default filter would require an | 180 // require pre-scaling if the default filter would require an |
| 183 // allocation that exceeds this limit. | 181 // allocation that exceeds this limit. |
| 184 const size_t kImageCacheSingleAllocationByteLimit = 64 * 1024 * 1024; | 182 const size_t kImageCacheSingleAllocationByteLimit = 64 * 1024 * 1024; |
| 185 | 183 |
| 186 const size_t kEmulatedDiscardableMemoryBytesToKeepWhenWidgetsHidden = | 184 const size_t kEmulatedDiscardableMemoryBytesToKeepWhenWidgetsHidden = |
| 187 4 * 1024 * 1024; | 185 4 * 1024 * 1024; |
| 188 | 186 |
| (...skipping 820 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1009 idle_timer_.Start(FROM_HERE, | 1007 idle_timer_.Start(FROM_HERE, |
| 1010 base::TimeDelta::FromMilliseconds(initial_delay_ms), | 1008 base::TimeDelta::FromMilliseconds(initial_delay_ms), |
| 1011 this, &RenderThreadImpl::IdleHandler); | 1009 this, &RenderThreadImpl::IdleHandler); |
| 1012 } | 1010 } |
| 1013 | 1011 |
| 1014 void RenderThreadImpl::IdleHandler() { | 1012 void RenderThreadImpl::IdleHandler() { |
| 1015 bool run_in_foreground_tab = (widget_count_ > hidden_widget_count_) && | 1013 bool run_in_foreground_tab = (widget_count_ > hidden_widget_count_) && |
| 1016 GetContentClient()->renderer()-> | 1014 GetContentClient()->renderer()-> |
| 1017 RunIdleHandlerWhenWidgetsHidden(); | 1015 RunIdleHandlerWhenWidgetsHidden(); |
| 1018 if (run_in_foreground_tab) { | 1016 if (run_in_foreground_tab) { |
| 1019 IdleHandlerInForegroundTab(); | 1017 if (idle_notifications_to_skip_ > 0) { |
| 1018 --idle_notifications_to_skip_; |
| 1019 } else { |
| 1020 base::allocator::ReleaseFreeMemory(); |
| 1021 base::DiscardableMemory::ReduceMemoryUsage(); |
| 1022 } |
| 1023 ScheduleIdleHandler(kLongIdleHandlerDelayMs); |
| 1020 return; | 1024 return; |
| 1021 } | 1025 } |
| 1022 | 1026 |
| 1023 base::allocator::ReleaseFreeMemory(); | 1027 base::allocator::ReleaseFreeMemory(); |
| 1024 | 1028 |
| 1025 // Continue the idle timer if the webkit shared timer is not suspended or | 1029 // Continue the idle timer if the webkit shared timer is not suspended or |
| 1026 // something is left to do. | 1030 // something is left to do. |
| 1027 bool continue_timer = !webkit_shared_timer_suspended_; | 1031 bool continue_timer = !webkit_shared_timer_suspended_; |
| 1028 | 1032 |
| 1029 if (blink::mainThreadIsolate() && | 1033 if (blink::mainThreadIsolate() && |
| (...skipping 23 matching lines...) Expand all Loading... |
| 1053 idle_notification_delay_in_ms_ + | 1057 idle_notification_delay_in_ms_ + |
| 1054 1000000 / (idle_notification_delay_in_ms_ + 2000))); | 1058 1000000 / (idle_notification_delay_in_ms_ + 2000))); |
| 1055 | 1059 |
| 1056 } else { | 1060 } else { |
| 1057 idle_timer_.Stop(); | 1061 idle_timer_.Stop(); |
| 1058 } | 1062 } |
| 1059 | 1063 |
| 1060 FOR_EACH_OBSERVER(RenderProcessObserver, observers_, IdleNotification()); | 1064 FOR_EACH_OBSERVER(RenderProcessObserver, observers_, IdleNotification()); |
| 1061 } | 1065 } |
| 1062 | 1066 |
| 1063 void RenderThreadImpl::IdleHandlerInForegroundTab() { | |
| 1064 // Increase the delay in the same way as in IdleHandler, | |
| 1065 // but make it periodic by reseting it once it is too big. | |
| 1066 int64 new_delay_ms = idle_notification_delay_in_ms_ + | |
| 1067 1000000 / (idle_notification_delay_in_ms_ + 2000); | |
| 1068 if (new_delay_ms >= kLongIdleHandlerDelayMs) | |
| 1069 new_delay_ms = kShortIdleHandlerDelayMs; | |
| 1070 | |
| 1071 if (idle_notifications_to_skip_ > 0) { | |
| 1072 idle_notifications_to_skip_--; | |
| 1073 } else { | |
| 1074 int cpu_usage = 0; | |
| 1075 Send(new ViewHostMsg_GetCPUUsage(&cpu_usage)); | |
| 1076 // Idle notification hint roughly specifies the expected duration of the | |
| 1077 // idle pause. We set it proportional to the idle timer delay. | |
| 1078 int idle_hint = static_cast<int>(new_delay_ms / 10); | |
| 1079 if (cpu_usage < kIdleCPUUsageThresholdInPercents) { | |
| 1080 base::allocator::ReleaseFreeMemory(); | |
| 1081 | |
| 1082 bool finished_idle_work = true; | |
| 1083 if (blink::mainThreadIsolate() && | |
| 1084 !blink::mainThreadIsolate()->IdleNotification(idle_hint)) { | |
| 1085 finished_idle_work = false; | |
| 1086 } | |
| 1087 if (!base::DiscardableMemory::ReduceMemoryUsage()) | |
| 1088 finished_idle_work = false; | |
| 1089 | |
| 1090 // V8 finished collecting garbage and discardable memory system has no | |
| 1091 // more idle work left. | |
| 1092 if (finished_idle_work) | |
| 1093 new_delay_ms = kLongIdleHandlerDelayMs; | |
| 1094 } | |
| 1095 } | |
| 1096 ScheduleIdleHandler(new_delay_ms); | |
| 1097 } | |
| 1098 | |
| 1099 int64 RenderThreadImpl::GetIdleNotificationDelayInMs() const { | 1067 int64 RenderThreadImpl::GetIdleNotificationDelayInMs() const { |
| 1100 return idle_notification_delay_in_ms_; | 1068 return idle_notification_delay_in_ms_; |
| 1101 } | 1069 } |
| 1102 | 1070 |
| 1103 void RenderThreadImpl::SetIdleNotificationDelayInMs( | 1071 void RenderThreadImpl::SetIdleNotificationDelayInMs( |
| 1104 int64 idle_notification_delay_in_ms) { | 1072 int64 idle_notification_delay_in_ms) { |
| 1105 idle_notification_delay_in_ms_ = idle_notification_delay_in_ms; | 1073 idle_notification_delay_in_ms_ = idle_notification_delay_in_ms; |
| 1106 } | 1074 } |
| 1107 | 1075 |
| 1108 void RenderThreadImpl::UpdateHistograms(int sequence_number) { | 1076 void RenderThreadImpl::UpdateHistograms(int sequence_number) { |
| (...skipping 556 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1665 hidden_widget_count_--; | 1633 hidden_widget_count_--; |
| 1666 | 1634 |
| 1667 if (!GetContentClient()->renderer()->RunIdleHandlerWhenWidgetsHidden()) { | 1635 if (!GetContentClient()->renderer()->RunIdleHandlerWhenWidgetsHidden()) { |
| 1668 return; | 1636 return; |
| 1669 } | 1637 } |
| 1670 | 1638 |
| 1671 ScheduleIdleHandler(kLongIdleHandlerDelayMs); | 1639 ScheduleIdleHandler(kLongIdleHandlerDelayMs); |
| 1672 } | 1640 } |
| 1673 | 1641 |
| 1674 } // namespace content | 1642 } // namespace content |
| OLD | NEW |