Index: chrome/browser/chromeos/resource_reporter/resource_reporter.cc |
diff --git a/chrome/browser/chromeos/resource_reporter/resource_reporter.cc b/chrome/browser/chromeos/resource_reporter/resource_reporter.cc |
index 30d3041fa8945618ea9cbd2d5fca6a65acc9c8ea..4561da25d81169f7b0cb3b64813bb2c6f2c9d711 100644 |
--- a/chrome/browser/chromeos/resource_reporter/resource_reporter.cc |
+++ b/chrome/browser/chromeos/resource_reporter/resource_reporter.cc |
@@ -9,6 +9,7 @@ |
#include <utility> |
#include "base/bind.h" |
+#include "base/memory/memory_coordinator_client_registry.h" |
#include "base/memory/memory_pressure_monitor.h" |
#include "base/memory/ptr_util.h" |
#include "base/rand_util.h" |
@@ -119,6 +120,7 @@ void ResourceReporter::StartMonitoring( |
is_monitoring_ = true; |
memory_pressure_listener_.reset(new base::MemoryPressureListener( |
base::Bind(&ResourceReporter::OnMemoryPressure, base::Unretained(this)))); |
+ base::MemoryCoordinatorClientRegistry::GetInstance()->Register(this); |
} |
void ResourceReporter::StopMonitoring() { |
@@ -131,11 +133,12 @@ void ResourceReporter::StopMonitoring() { |
// before we get an update from the task manager with all background |
// calculations refreshed. In this case we must unregister from the task |
// manager here. |
- if (observed_task_manager()) |
- observed_task_manager()->RemoveObserver(this); |
+ StopRecordingCurrentState(); |
is_monitoring_ = false; |
memory_pressure_listener_.reset(); |
+ |
+ base::MemoryCoordinatorClientRegistry::GetInstance()->Unregister(this); |
} |
void ResourceReporter::OnTasksRefreshedWithBackgroundCalculations( |
@@ -191,7 +194,7 @@ void ResourceReporter::OnTasksRefreshedWithBackgroundCalculations( |
// unsubscribing and then resubscribing to the task manager again on the |
// next event, we keep listening to the task manager as long as the memory |
// pressure level is critical AND we couldn't find any violators yet. |
- observed_task_manager()->RemoveObserver(this); |
+ StopRecordingCurrentState(); |
} |
// Schedule reporting the samples. |
@@ -391,35 +394,58 @@ void ResourceReporter::OnMemoryPressure( |
MemoryPressureLevel memory_pressure_level) { |
if (memory_pressure_level == |
MemoryPressureLevel::MEMORY_PRESSURE_LEVEL_CRITICAL) { |
- // If we are already listening to the task manager, then we're waiting for |
- // a refresh event. |
- if (observed_task_manager()) |
+ StartRecordingCurrentState(); |
+ } else { |
+ StopRecordingCurrentState(); |
+ } |
+} |
+ |
+void ResourceReporter::StartRecordingCurrentState() { |
+ // If we are already listening to the task manager, then we're waiting for |
+ // a refresh event. |
+ if (observed_task_manager()) |
+ return; |
+ |
+ // We only record Rappor samples only if it's the first ever critical memory |
+ // pressure event we receive, or it has been more than |
+ // |kMinimumTimeBetweenReportsInMs| since the last time we recorded samples. |
+ if (g_browser_process->local_state()) { |
+ const base::Time now = base::Time::NowFromSystemTime(); |
+ const base::Time last_rappor_report_time = base::Time::FromDoubleT( |
+ g_browser_process->local_state()->GetDouble(kLastRapporReportTimeKey)); |
+ const base::TimeDelta delta_since_last_report = |
+ now >= last_rappor_report_time ? now - last_rappor_report_time |
+ : base::TimeDelta::Max(); |
+ |
+ if (delta_since_last_report < kMinimumTimeBetweenReports) |
return; |
+ } |
- // We only record Rappor samples only if it's the first ever critical memory |
- // pressure event we receive, or it has been more than |
- // |kMinimumTimeBetweenReportsInMs| since the last time we recorded samples. |
- if (g_browser_process->local_state()) { |
- const base::Time now = base::Time::NowFromSystemTime(); |
- const base::Time last_rappor_report_time = |
- base::Time::FromDoubleT(g_browser_process->local_state()->GetDouble( |
- kLastRapporReportTimeKey)); |
- const base::TimeDelta delta_since_last_report = |
- now >= last_rappor_report_time ? now - last_rappor_report_time |
- : base::TimeDelta::Max(); |
- |
- if (delta_since_last_report < kMinimumTimeBetweenReports) |
- return; |
- } |
+ // Start listening to the task manager and wait for the first refresh event |
+ // with background calculations completion. |
+ task_manager_to_observe_->AddObserver(this); |
+} |
- // Start listening to the task manager and wait for the first refresh event |
- // with background calculations completion. |
- task_manager_to_observe_->AddObserver(this); |
- } else { |
- // If we are still listening to the task manager from an earlier critical |
- // memory pressure level, we need to stop listening to it. |
- if (observed_task_manager()) |
- observed_task_manager()->RemoveObserver(this); |
+void ResourceReporter::StopRecordingCurrentState() { |
+ // If we are still listening to the task manager from an earlier critical |
+ // memory pressure level, we need to stop listening to it. |
+ if (observed_task_manager()) |
+ observed_task_manager()->RemoveObserver(this); |
+} |
+ |
+void ResourceReporter::OnMemoryStateChange(base::MemoryState state) { |
+ switch (state) { |
+ case base::MemoryState::NORMAL: |
+ StopRecordingCurrentState(); |
+ break; |
+ case base::MemoryState::THROTTLED: |
+ StartRecordingCurrentState(); |
+ break; |
+ case base::MemoryState::SUSPENDED: |
+ // Note: Not supported at present. Fall through. |
+ case base::MemoryState::UNKNOWN: |
+ NOTREACHED(); |
+ break; |
} |
} |