Chromium Code Reviews| Index: chrome/browser/sessions/tab_loader.cc |
| diff --git a/chrome/browser/sessions/tab_loader.cc b/chrome/browser/sessions/tab_loader.cc |
| index 172d5d213b4bfe7e057f240277854b18a8a3f4e7..a2b349fcf28a0c377f9ba5efef60ba87a9cc9e0d 100644 |
| --- a/chrome/browser/sessions/tab_loader.cc |
| +++ b/chrome/browser/sessions/tab_loader.cc |
| @@ -7,6 +7,7 @@ |
| #include <algorithm> |
| #include <string> |
| +#include "base/memory/memory_coordinator_client_registry.h" |
| #include "base/memory/memory_pressure_monitor.h" |
| #include "base/memory/ptr_util.h" |
| #include "base/metrics/histogram_macros.h" |
| @@ -24,6 +25,7 @@ |
| #include "content/public/browser/render_widget_host.h" |
| #include "content/public/browser/render_widget_host_view.h" |
| #include "content/public/browser/web_contents.h" |
| +#include "content/public/common/content_features.h" |
| using content::NavigationController; |
| using content::RenderWidgetHost; |
| @@ -79,6 +81,7 @@ void TabLoader::RestoreTabs(const std::vector<RestoredTab>& tabs, |
| TabLoader::TabLoader(base::TimeTicks restore_started) |
| : memory_pressure_listener_( |
| base::Bind(&TabLoader::OnMemoryPressure, base::Unretained(this))), |
| + memory_state_(base::MemoryState::NORMAL), |
|
sky
2016/09/26 16:41:57
Should this be initialized to the real value? By t
hajimehoshi
2016/09/27 05:59:16
chrisha@: IIUC the initial value should always be
bashi
2016/09/29 06:30:52
Yes. Current plan is that the initial state is NOR
|
| force_load_delay_multiplier_(1), |
| loading_enabled_(true), |
| restore_started_(restore_started) { |
| @@ -88,12 +91,14 @@ TabLoader::TabLoader(base::TimeTicks restore_started) |
| SessionRestoreStatsCollector::UmaStatsReportingDelegate>()); |
| shared_tab_loader_ = this; |
| this_retainer_ = this; |
| + base::MemoryCoordinatorClientRegistry::GetInstance()->Register(this); |
| } |
| TabLoader::~TabLoader() { |
| DCHECK(tabs_loading_.empty() && tabs_to_load_.empty()); |
| DCHECK(shared_tab_loader_ == this); |
| shared_tab_loader_ = nullptr; |
| + base::MemoryCoordinatorClientRegistry::GetInstance()->Unregister(this); |
| } |
| void TabLoader::StartLoading(const std::vector<RestoredTab>& tabs) { |
| @@ -131,12 +136,8 @@ void TabLoader::StartLoading(const std::vector<RestoredTab>& tabs) { |
| // There is already at least one tab loading (the active tab). As such we |
| // only have to start the timeout timer here. But, don't restore background |
| // tabs if the system is under memory pressure. |
| - base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level = |
| - CurrentMemoryPressureLevel(); |
| - |
| - if (memory_pressure_level != |
| - base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE) { |
| - OnMemoryPressure(memory_pressure_level); |
| + if (ShouldPurgeMemory()) { |
| + PurgeMemory(); |
| return; |
| } |
| @@ -159,11 +160,8 @@ void TabLoader::LoadNextTab() { |
| // large delay between a memory pressure event and receiving a notification |
| // of that event (in that case tab restore can trigger memory pressure but |
| // will complete before the notification arrives). |
| - base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level = |
| - CurrentMemoryPressureLevel(); |
| - if (memory_pressure_level != |
| - base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE) { |
| - OnMemoryPressure(memory_pressure_level); |
| + if (ShouldPurgeMemory()) { |
| + PurgeMemory(); |
| return; |
| } |
| @@ -242,16 +240,40 @@ void TabLoader::HandleTabClosedOrLoaded(NavigationController* controller) { |
| LoadNextTab(); |
| } |
| -base::MemoryPressureListener::MemoryPressureLevel |
| - TabLoader::CurrentMemoryPressureLevel() { |
| - if (base::MemoryPressureMonitor::Get()) |
| - return base::MemoryPressureMonitor::Get()->GetCurrentPressureLevel(); |
| - |
| - return base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE; |
| +bool TabLoader::ShouldPurgeMemory() const { |
| + if (base::FeatureList::IsEnabled(features::kMemoryCoordinator)) { |
|
sky
2016/09/26 16:41:57
no {}
hajimehoshi
2016/09/27 05:59:15
Done.
|
| + return memory_state_ != base::MemoryState::NORMAL; |
| + } |
| + if (base::MemoryPressureMonitor::Get()) { |
| + return base::MemoryPressureMonitor::Get()->GetCurrentPressureLevel() != |
| + base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE; |
| + } |
| + return false; |
| } |
| void TabLoader::OnMemoryPressure( |
| base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level) { |
| + PurgeMemory(); |
| +} |
| + |
| +void TabLoader::OnMemoryStateChange(base::MemoryState state) { |
| + memory_state_ = state; |
| + switch (state) { |
| + case base::MemoryState::NORMAL: |
| + break; |
| + case base::MemoryState::THROTTLED: |
| + PurgeMemory(); |
| + break; |
| + case base::MemoryState::SUSPENDED: |
| + // Note that SUSPENDED never occurs in the main browser process so far. |
| + // Fall through. |
| + case base::MemoryState::UNKNOWN: |
| + NOTREACHED(); |
| + break; |
| + } |
| +} |
| + |
| +void TabLoader::PurgeMemory() { |
|
chrisha
2016/09/26 14:18:53
PurgeMemory isn't the best name here, as it's not
sky
2016/09/26 16:41:57
SGTM
hajimehoshi
2016/09/27 05:59:16
Done.
|
| // When receiving a resource pressure level warning, we stop pre-loading more |
| // tabs since we are running in danger of loading more tabs by throwing out |
| // old ones. |