Index: chrome/browser/performance_monitor/performance_monitor.cc |
diff --git a/chrome/browser/performance_monitor/performance_monitor.cc b/chrome/browser/performance_monitor/performance_monitor.cc |
index 6b648e9dbe380fd2828c70e1a10c3286f177dabb..238e04636cf00664aa2514fcd5488e7b44514771 100644 |
--- a/chrome/browser/performance_monitor/performance_monitor.cc |
+++ b/chrome/browser/performance_monitor/performance_monitor.cc |
@@ -7,7 +7,7 @@ |
#include <stddef.h> |
#include <utility> |
-#include "base/memory/singleton.h" |
+#include "base/memory/ptr_util.h" |
#include "base/process/process_iterator.h" |
#include "base/strings/utf_string_conversions.h" |
#include "base/time/time.h" |
@@ -26,38 +26,18 @@ |
using content::BrowserThread; |
+namespace performance_monitor { |
+ |
namespace { |
// The default interval at which PerformanceMonitor performs its timed |
// collections. |
const int kGatherIntervalInSeconds = 120; |
-} // namespace |
- |
-namespace performance_monitor { |
- |
-PerformanceMonitor::PerformanceMonitor() { |
-} |
- |
-PerformanceMonitor::~PerformanceMonitor() { |
-} |
- |
-// static |
-PerformanceMonitor* PerformanceMonitor::GetInstance() { |
- return base::Singleton<PerformanceMonitor>::get(); |
-} |
- |
-void PerformanceMonitor::StartGatherCycle() { |
- DCHECK_CURRENTLY_ON(BrowserThread::UI); |
- repeating_timer_.Start(FROM_HERE, |
- base::TimeDelta::FromSeconds(kGatherIntervalInSeconds), |
- this, &PerformanceMonitor::GatherMetricsMapOnUIThread); |
-} |
- |
-namespace { |
+base::LazyInstance<PerformanceMonitor> g_monitor = LAZY_INSTANCE_INITIALIZER; |
void GatherMetricsForRenderProcess(content::RenderProcessHost* host, |
- ProcessMetricsMetadata& data) { |
+ ProcessMetricsMetadata* data) { |
DCHECK_CURRENTLY_ON(BrowserThread::UI); |
#if defined(ENABLE_EXTENSIONS) |
content::BrowserContext* browser_context = host->GetBrowserContext(); |
@@ -81,16 +61,31 @@ void GatherMetricsForRenderProcess(content::RenderProcessHost* host, |
if (!extension) |
return; |
- if (extensions::BackgroundInfo::HasPersistentBackgroundPage(extension)) { |
- data.process_subtype = kProcessSubtypeExtensionPersistent; |
- } else { |
- data.process_subtype = kProcessSubtypeExtensionEvent; |
- } |
+ data->process_subtype = |
+ extensions::BackgroundInfo::HasPersistentBackgroundPage(extension) |
+ ? kProcessSubtypeExtensionPersistent |
+ : kProcessSubtypeExtensionEvent; |
#endif |
} |
} // namespace |
+PerformanceMonitor::PerformanceMonitor() {} |
+ |
+PerformanceMonitor::~PerformanceMonitor() {} |
+ |
+// static |
+PerformanceMonitor* PerformanceMonitor::GetInstance() { |
+ return g_monitor.Pointer(); |
+} |
+ |
+void PerformanceMonitor::StartGatherCycle() { |
+ DCHECK_CURRENTLY_ON(BrowserThread::UI); |
+ repeating_timer_.Start(FROM_HERE, |
+ base::TimeDelta::FromSeconds(kGatherIntervalInSeconds), |
+ this, &PerformanceMonitor::GatherMetricsMapOnUIThread); |
+} |
+ |
void PerformanceMonitor::GatherMetricsMapOnUIThread() { |
DCHECK_CURRENTLY_ON(BrowserThread::UI); |
@@ -108,7 +103,7 @@ void PerformanceMonitor::GatherMetricsMapOnUIThread() { |
data.process_type = content::PROCESS_TYPE_RENDERER; |
data.handle = host->GetHandle(); |
- GatherMetricsForRenderProcess(host, data); |
+ GatherMetricsForRenderProcess(host, &data); |
MarkProcessAsAlive(data, current_update_sequence); |
} |
@@ -132,11 +127,12 @@ void PerformanceMonitor::MarkProcessAsAlive( |
MetricsMap::iterator process_metrics_iter = metrics_map_.find(handle); |
if (process_metrics_iter == metrics_map_.end()) { |
// If we're not already watching the process, let's initialize it. |
- metrics_map_[handle].Initialize(process_data, current_update_sequence); |
+ metrics_map_[handle] = base::MakeUnique<ProcessMetricsHistory>(); |
+ metrics_map_[handle]->Initialize(process_data, current_update_sequence); |
} else { |
// If we are watching the process, touch it to keep it alive. |
- ProcessMetricsHistory& process_metrics = process_metrics_iter->second; |
- process_metrics.set_last_update_sequence(current_update_sequence); |
+ ProcessMetricsHistory* process_metrics = process_metrics_iter->second.get(); |
+ process_metrics->set_last_update_sequence(current_update_sequence); |
} |
} |
@@ -144,8 +140,8 @@ void PerformanceMonitor::GatherMetricsMapOnIOThread( |
int current_update_sequence) { |
DCHECK_CURRENTLY_ON(BrowserThread::IO); |
- std::unique_ptr<std::vector<ProcessMetricsMetadata>> process_data_list( |
- new std::vector<ProcessMetricsMetadata>()); |
+ auto process_data_list = |
+ base::MakeUnique<std::vector<ProcessMetricsMetadata>>(); |
// Find all child processes (does not include renderers), which has to be |
// done on the IO thread. |
@@ -179,9 +175,8 @@ void PerformanceMonitor::MarkProcessesAsAliveOnUIThread( |
std::unique_ptr<std::vector<ProcessMetricsMetadata>> process_data_list, |
int current_update_sequence) { |
DCHECK_CURRENTLY_ON(BrowserThread::UI); |
- for (size_t i = 0; i < process_data_list->size(); ++i) { |
- MarkProcessAsAlive((*process_data_list)[i], current_update_sequence); |
- } |
+ for (const ProcessMetricsMetadata& data : *process_data_list) |
+ MarkProcessAsAlive(data, current_update_sequence); |
BrowserThread::PostTask( |
BrowserThread::IO, FROM_HERE, |
@@ -194,12 +189,12 @@ void PerformanceMonitor::UpdateMetricsOnIOThread(int current_update_sequence) { |
// Update metrics for all watched processes; remove dead entries from the map. |
MetricsMap::iterator iter = metrics_map_.begin(); |
while (iter != metrics_map_.end()) { |
- ProcessMetricsHistory& process_metrics = iter->second; |
- if (process_metrics.last_update_sequence() != current_update_sequence) { |
+ ProcessMetricsHistory* process_metrics = iter->second.get(); |
+ if (process_metrics->last_update_sequence() != current_update_sequence) { |
// Not touched this iteration; let's get rid of it. |
metrics_map_.erase(iter++); |
} else { |
- process_metrics.SampleMetrics(); |
+ process_metrics->SampleMetrics(); |
++iter; |
} |
} |
@@ -211,9 +206,8 @@ void PerformanceMonitor::UpdateMetricsOnIOThread(int current_update_sequence) { |
void PerformanceMonitor::RunTriggersUIThread() { |
DCHECK_CURRENTLY_ON(BrowserThread::UI); |
- for (auto it = metrics_map_.begin(); it != metrics_map_.end(); ++it) { |
- it->second.RunPerformanceTriggers(); |
- } |
+ for (auto& metrics : metrics_map_) |
+ metrics.second->RunPerformanceTriggers(); |
StartGatherCycle(); |
} |