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 <utility> | 10 #include <utility> |
(...skipping 880 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
891 categorized_worker_pool_->background_worker_thread_id(), | 891 categorized_worker_pool_->background_worker_thread_id(), |
892 base::ThreadPriority::BACKGROUND); | 892 base::ThreadPriority::BACKGROUND); |
893 #endif | 893 #endif |
894 | 894 |
895 record_purge_suspend_metric_closure_.Reset(base::Bind( | 895 record_purge_suspend_metric_closure_.Reset(base::Bind( |
896 &RenderThreadImpl::RecordPurgeAndSuspendMetrics, base::Unretained(this))); | 896 &RenderThreadImpl::RecordPurgeAndSuspendMetrics, base::Unretained(this))); |
897 record_purge_suspend_growth_metric_closure_.Reset( | 897 record_purge_suspend_growth_metric_closure_.Reset( |
898 base::Bind(&RenderThreadImpl::RecordPurgeAndSuspendMemoryGrowthMetrics, | 898 base::Bind(&RenderThreadImpl::RecordPurgeAndSuspendMemoryGrowthMetrics, |
899 base::Unretained(this))); | 899 base::Unretained(this))); |
900 | 900 |
901 purge_before_suspend_timers_closure_.Reset(base::Bind( | |
902 &RenderThreadImpl::PurgeBeforeSuspendTimerQueue, base::Unretained(this))); | |
903 suspend_timers_when_backgrounded_closure_.Reset( | |
904 base::Bind(&RenderThreadImpl::SuspendTimerQueueWhenBackgrounded, | |
905 base::Unretained(this))); | |
906 | |
901 base::MemoryCoordinatorClientRegistry::GetInstance()->Register(this); | 907 base::MemoryCoordinatorClientRegistry::GetInstance()->Register(this); |
902 | 908 |
903 // If this renderer doesn't run inside the browser process, enable | 909 // If this renderer doesn't run inside the browser process, enable |
904 // SequencedWorkerPool. Otherwise, it should already have been enabled. | 910 // SequencedWorkerPool. Otherwise, it should already have been enabled. |
905 // TODO(fdoray): Remove this once the SequencedWorkerPool to TaskScheduler | 911 // TODO(fdoray): Remove this once the SequencedWorkerPool to TaskScheduler |
906 // redirection experiment concludes https://crbug.com/622400. | 912 // redirection experiment concludes https://crbug.com/622400. |
907 if (!command_line.HasSwitch(switches::kSingleProcess)) | 913 if (!command_line.HasSwitch(switches::kSingleProcess)) |
908 base::SequencedWorkerPool::EnableForProcess(); | 914 base::SequencedWorkerPool::EnableForProcess(); |
909 } | 915 } |
910 | 916 |
(...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1196 AddFilter(devtools_agent_message_filter_.get()); | 1202 AddFilter(devtools_agent_message_filter_.get()); |
1197 | 1203 |
1198 if (GetContentClient()->renderer()->RunIdleHandlerWhenWidgetsHidden()) { | 1204 if (GetContentClient()->renderer()->RunIdleHandlerWhenWidgetsHidden()) { |
1199 ScheduleIdleHandler(kLongIdleHandlerDelayMs); | 1205 ScheduleIdleHandler(kLongIdleHandlerDelayMs); |
1200 } else { | 1206 } else { |
1201 // If we do not track widget visibility, then assume conservatively that | 1207 // If we do not track widget visibility, then assume conservatively that |
1202 // the isolate is in background. This reduces memory usage. | 1208 // the isolate is in background. This reduces memory usage. |
1203 isolate->IsolateInBackgroundNotification(); | 1209 isolate->IsolateInBackgroundNotification(); |
1204 } | 1210 } |
1205 | 1211 |
1206 renderer_scheduler_->SetTimerQueueSuspensionWhenBackgroundedEnabled( | |
1207 GetContentClient() | |
1208 ->renderer() | |
1209 ->AllowTimerSuspensionWhenProcessBackgrounded()); | |
1210 | |
1211 SkGraphics::SetResourceCacheSingleAllocationByteLimit( | 1212 SkGraphics::SetResourceCacheSingleAllocationByteLimit( |
1212 kImageCacheSingleAllocationByteLimit); | 1213 kImageCacheSingleAllocationByteLimit); |
1213 | 1214 |
1214 // Hook up blink's codecs so skia can call them | 1215 // Hook up blink's codecs so skia can call them |
1215 SkGraphics::SetImageGeneratorFromEncodedFactory( | 1216 SkGraphics::SetImageGeneratorFromEncodedFactory( |
1216 blink::WebImageGenerator::create); | 1217 blink::WebImageGenerator::create); |
1217 | 1218 |
1218 if (command_line.HasSwitch(switches::kMemoryMetrics)) { | 1219 if (command_line.HasSwitch(switches::kMemoryMetrics)) { |
1219 memory_observer_.reset(new MemoryObserver()); | 1220 memory_observer_.reset(new MemoryObserver()); |
1220 message_loop()->AddTaskObserver(memory_observer_.get()); | 1221 message_loop()->AddTaskObserver(memory_observer_.get()); |
(...skipping 413 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1634 IPC_MESSAGE_UNHANDLED(handled = false) | 1635 IPC_MESSAGE_UNHANDLED(handled = false) |
1635 IPC_END_MESSAGE_MAP() | 1636 IPC_END_MESSAGE_MAP() |
1636 return handled; | 1637 return handled; |
1637 } | 1638 } |
1638 | 1639 |
1639 void RenderThreadImpl::OnProcessBackgrounded(bool backgrounded) { | 1640 void RenderThreadImpl::OnProcessBackgrounded(bool backgrounded) { |
1640 ChildThreadImpl::OnProcessBackgrounded(backgrounded); | 1641 ChildThreadImpl::OnProcessBackgrounded(backgrounded); |
1641 | 1642 |
1642 if (backgrounded) { | 1643 if (backgrounded) { |
1643 renderer_scheduler_->OnRendererBackgrounded(); | 1644 renderer_scheduler_->OnRendererBackgrounded(); |
1645 | |
1646 if (GetContentClient() | |
1647 ->renderer() | |
1648 ->AllowTimerSuspensionWhenProcessBackgrounded()) { | |
1649 base::TimeDelta suspend_timers_when_backgrounded_delay = | |
1650 base::TimeDelta::FromMilliseconds( | |
1651 kSuspendTimersWhenBackgroundedDelayMillis); | |
1652 GetRendererScheduler()->DefaultTaskRunner()->PostDelayedTask( | |
1653 FROM_HERE, purge_before_suspend_timers_closure_.callback(), | |
1654 suspend_timers_when_backgrounded_delay); | |
1655 } | |
1644 } else { | 1656 } else { |
1645 renderer_scheduler_->OnRendererForegrounded(); | 1657 renderer_scheduler_->OnRendererForegrounded(); |
1658 | |
1659 purge_before_suspend_timers_closure_.Cancel(); | |
1660 purge_before_suspend_timers_closure_.Reset( | |
1661 base::Bind(&RenderThreadImpl::PurgeBeforeSuspendTimerQueue, | |
1662 base::Unretained(this))); | |
1663 suspend_timers_when_backgrounded_closure_.Cancel(); | |
1664 suspend_timers_when_backgrounded_closure_.Reset( | |
1665 base::Bind(&RenderThreadImpl::SuspendTimerQueueWhenBackgrounded, | |
1666 base::Unretained(this))); | |
1667 | |
1646 // TODO(tasak): after enabling MemoryCoordinator, remove this Notify | 1668 // TODO(tasak): after enabling MemoryCoordinator, remove this Notify |
1647 // and follow MemoryCoordinator's request. | 1669 // and follow MemoryCoordinator's request. |
1648 if (base::FeatureList::IsEnabled(features::kPurgeAndSuspend)) | 1670 if (base::FeatureList::IsEnabled(features::kPurgeAndSuspend)) |
1649 base::MemoryCoordinatorClientRegistry::GetInstance()->Notify( | 1671 base::MemoryCoordinatorClientRegistry::GetInstance()->Notify( |
1650 base::MemoryState::NORMAL); | 1672 base::MemoryState::NORMAL); |
1651 | 1673 |
1652 record_purge_suspend_metric_closure_.Cancel(); | 1674 record_purge_suspend_metric_closure_.Cancel(); |
1653 record_purge_suspend_metric_closure_.Reset( | 1675 record_purge_suspend_metric_closure_.Reset( |
1654 base::Bind(&RenderThreadImpl::RecordPurgeAndSuspendMetrics, | 1676 base::Bind(&RenderThreadImpl::RecordPurgeAndSuspendMetrics, |
1655 base::Unretained(this))); | 1677 base::Unretained(this))); |
1656 record_purge_suspend_growth_metric_closure_.Cancel(); | 1678 record_purge_suspend_growth_metric_closure_.Cancel(); |
1657 record_purge_suspend_growth_metric_closure_.Reset( | 1679 record_purge_suspend_growth_metric_closure_.Reset( |
1658 base::Bind(&RenderThreadImpl::RecordPurgeAndSuspendMemoryGrowthMetrics, | 1680 base::Bind(&RenderThreadImpl::RecordPurgeAndSuspendMemoryGrowthMetrics, |
1659 base::Unretained(this))); | 1681 base::Unretained(this))); |
1660 } | 1682 } |
1661 } | 1683 } |
1662 | 1684 |
1685 void RenderThreadImpl::PurgeBeforeSuspendTimerQueue() { | |
haraken
2017/02/02 08:53:12
PurgeBeforeSuspendTimerQueue => PurgeAndSuspendTim
tasak
2017/02/03 03:13:14
Done.
| |
1686 DCHECK(IsMainThread()); | |
1687 if (!RendererIsHidden()) | |
1688 return; | |
1689 base::MemoryCoordinatorClientRegistry::GetInstance()->Notify( | |
1690 base::MemoryState::SUSPENDED); | |
haraken
2017/02/02 08:53:13
You don't need to do this in this CL but we want t
tasak
2017/02/03 03:13:14
Acknowledged.
| |
1691 GetRendererScheduler()->DefaultTaskRunner()->PostDelayedTask( | |
1692 FROM_HERE, suspend_timers_when_backgrounded_closure_.callback(), | |
1693 base::TimeDelta::FromSeconds(5)); | |
haraken
2017/02/02 08:53:13
Add a comment and mention why this delay is needed
tasak
2017/02/03 03:13:14
Done.
| |
1694 } | |
1695 | |
1696 void RenderThreadImpl::SuspendTimerQueueWhenBackgrounded() { | |
1697 DCHECK(IsMainThread()); | |
1698 if (!RendererIsHidden()) | |
1699 return; | |
1700 renderer_scheduler_->SuspendRenderer(); | |
1701 } | |
1702 | |
1663 void RenderThreadImpl::OnProcessPurgeAndSuspend() { | 1703 void RenderThreadImpl::OnProcessPurgeAndSuspend() { |
1664 ChildThreadImpl::OnProcessPurgeAndSuspend(); | 1704 ChildThreadImpl::OnProcessPurgeAndSuspend(); |
1665 if (!RendererIsHidden()) | 1705 if (!RendererIsHidden()) |
1666 return; | 1706 return; |
1667 | 1707 |
1668 // TODO(bashi): Enable the tab suspension when MemoryCoordinator is enabled. | 1708 // TODO(bashi): Enable the tab suspension when MemoryCoordinator is enabled. |
1669 if (base::FeatureList::IsEnabled(features::kMemoryCoordinator)) | 1709 if (base::FeatureList::IsEnabled(features::kMemoryCoordinator)) |
1670 return; | 1710 return; |
1671 | 1711 |
1672 if (base::FeatureList::IsEnabled(features::kPurgeAndSuspend)) { | 1712 if (base::FeatureList::IsEnabled(features::kPurgeAndSuspend)) { |
(...skipping 767 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2440 } | 2480 } |
2441 } | 2481 } |
2442 | 2482 |
2443 void RenderThreadImpl::OnRendererInterfaceRequest( | 2483 void RenderThreadImpl::OnRendererInterfaceRequest( |
2444 mojom::RendererAssociatedRequest request) { | 2484 mojom::RendererAssociatedRequest request) { |
2445 DCHECK(!renderer_binding_.is_bound()); | 2485 DCHECK(!renderer_binding_.is_bound()); |
2446 renderer_binding_.Bind(std::move(request)); | 2486 renderer_binding_.Bind(std::move(request)); |
2447 } | 2487 } |
2448 | 2488 |
2449 } // namespace content | 2489 } // namespace content |
OLD | NEW |