Index: components/metrics/metrics_service.cc |
diff --git a/components/metrics/metrics_service.cc b/components/metrics/metrics_service.cc |
index 55aa9f10c8c0daaf3e0a764020602c5e3d7c5d1b..e868ea7c9bb1cc087644257b65c44e3edcf9e346 100644 |
--- a/components/metrics/metrics_service.cc |
+++ b/components/metrics/metrics_service.cc |
@@ -251,6 +251,40 @@ SyntheticTrialGroup::SyntheticTrialGroup(uint32 trial, uint32 group) { |
SyntheticTrialGroup::~SyntheticTrialGroup() { |
} |
+MetricsService::PersistentHistogramIterator::PersistentHistogramIterator( |
+ AllocatorSet& allocators, |
+ AllocatorSet::iterator pos) |
+ : allocators_(allocators), |
+ allocator_iter_(pos) { |
+ if (pos != allocators_.end()) { |
+ (*allocator_iter_)->CreateIterator(&histogram_iter_); |
+ // Have to call ++ to advance iterator to the first persistent histogram. |
+ operator++(); |
+ } |
+} |
+ |
+MetricsService::PersistentHistogramIterator& |
+MetricsService::PersistentHistogramIterator::operator++() { |
+ if (allocator_iter_ != allocators_.end()) { |
+ for (;;) { |
+ base::HistogramBase* h = base::HistogramBase::GetNextPersistentHistogram( |
+ *allocator_iter_, &histogram_iter_); |
+ if (h) { |
+ current_histogram_ = new HistogramPointer(h); |
+ break; |
+ } |
+ allocator_iter_++; |
+ if (allocator_iter_ == allocators_.end()) { |
+ histogram_iter_.clear(); // Clear so it matches end() iterator. |
+ current_histogram_ = nullptr; |
+ break; |
+ } |
+ (*allocator_iter_)->CreateIterator(&histogram_iter_); |
+ } |
+ } |
+ return *this; |
+} |
+ |
// static |
MetricsService::ShutdownCleanliness MetricsService::clean_shutdown_status_ = |
MetricsService::CLEANLY_SHUTDOWN; |
@@ -547,6 +581,18 @@ void MetricsService::PushExternalLog(const std::string& log) { |
log_manager_.StoreLog(log, MetricsLog::ONGOING_LOG); |
} |
+void MetricsService::AddPersistentMemorySegment( |
+ base::PersistentMemoryAllocator* allocator) { |
+ DCHECK(allocators_.find(allocator) == allocators_.end()); |
+ allocators_.insert(allocator); |
+} |
+ |
+void MetricsService::RemovePersistentMemorySegment( |
+ base::PersistentMemoryAllocator* allocator) { |
+ DCHECK(allocators_.find(allocator) != allocators_.end()); |
+ allocators_.erase(allocator); |
+} |
+ |
//------------------------------------------------------------------------------ |
// private methods |
//------------------------------------------------------------------------------ |
@@ -746,6 +792,11 @@ void MetricsService::CloseCurrentLog() { |
OpenNewLog(); // Start trivial log to hold our histograms. |
} |
+ base::PersistentMemoryAllocator* allocator = |
+ base::HistogramBase::GetDefaultPersistentMemoryAllocator(); |
+ if (allocator) |
+ allocator->UpdateStaticHistograms(); |
+ |
// Put incremental data (histogram deltas, and realtime stats deltas) at the |
// end of all log transmissions (initial log handles this separately). |
// RecordIncrementalStabilityElements only exists on the derived |
@@ -1105,12 +1156,17 @@ void MetricsService::RecordCurrentEnvironment(MetricsLog* log) { |
void MetricsService::RecordCurrentHistograms() { |
DCHECK(log_manager_.current_log()); |
histogram_snapshot_manager_.PrepareDeltas( |
+ base::StatisticsRecorder::begin(true), base::StatisticsRecorder::end(), |
+ base::Histogram::kNoFlags, base::Histogram::kUmaTargetedHistogramFlag); |
+ histogram_snapshot_manager_.PrepareDeltas( |
+ persistent_begin(), persistent_end(), |
base::Histogram::kNoFlags, base::Histogram::kUmaTargetedHistogramFlag); |
} |
void MetricsService::RecordCurrentStabilityHistograms() { |
DCHECK(log_manager_.current_log()); |
histogram_snapshot_manager_.PrepareDeltas( |
+ base::StatisticsRecorder::begin(true), base::StatisticsRecorder::end(), |
base::Histogram::kNoFlags, base::Histogram::kUmaStabilityHistogramFlag); |
} |
@@ -1149,4 +1205,12 @@ void MetricsService::SkipAndDiscardUpload() { |
log_upload_in_progress_ = false; |
} |
+MetricsService::PersistentHistogramIterator MetricsService::persistent_begin() { |
+ return PersistentHistogramIterator(allocators_, allocators_.begin()); |
+} |
+ |
+MetricsService::PersistentHistogramIterator MetricsService::persistent_end() { |
+ return PersistentHistogramIterator(allocators_, allocators_.end()); |
+} |
+ |
} // namespace metrics |