histogram_snapshot_manager.h revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
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 3// found in the LICENSE file. 4 5#ifndef BASE_METRICS_HISTOGRAM_SNAPSHOT_MANAGER_H_ 6#define BASE_METRICS_HISTOGRAM_SNAPSHOT_MANAGER_H_ 7 8#include <map> 9#include <string> 10 11#include "base/basictypes.h" 12#include "base/metrics/histogram_base.h" 13 14namespace base { 15 16class HistogramSamples; 17class HistogramFlattener; 18 19// HistogramSnapshotManager handles the logistics of gathering up available 20// histograms for recording either to disk or for transmission (such as from 21// renderer to browser, or from browser to UMA upload). Since histograms can sit 22// in memory for an extended period of time, and are vulnerable to memory 23// corruption, this class also validates as much rendundancy as it can before 24// calling for the marginal change (a.k.a., delta) in a histogram to be 25// recorded. 26class BASE_EXPORT HistogramSnapshotManager { 27 public: 28 explicit HistogramSnapshotManager(HistogramFlattener* histogram_flattener); 29 virtual ~HistogramSnapshotManager(); 30 31 // Snapshot all histograms, and ask |histogram_flattener_| to record the 32 // delta. |flags_to_set| is used to set flags for each histogram. 33 // |required_flags| is used to select histograms to be recorded. 34 // Only histograms that have all the flags specified by the argument will be 35 // chosen. If all histograms should be recorded, set it to 36 // |Histogram::kNoFlags|. 37 void PrepareDeltas(HistogramBase::Flags flags_to_set, 38 HistogramBase::Flags required_flags); 39 40 private: 41 // Snapshot this histogram, and record the delta. 42 void PrepareDelta(const HistogramBase& histogram); 43 44 // Try to detect and fix count inconsistency of logged samples. 45 void InspectLoggedSamplesInconsistency( 46 const HistogramSamples& new_snapshot, 47 HistogramSamples* logged_samples); 48 49 // For histograms, track what we've already recorded (as a sample for 50 // each histogram) so that we can record only the delta with the next log. 51 std::map<std::string, HistogramSamples*> logged_samples_; 52 53 // List of histograms found to be corrupt, and their problems. 54 std::map<std::string, int> inconsistencies_; 55 56 // |histogram_flattener_| handles the logistics of recording the histogram 57 // deltas. 58 HistogramFlattener* histogram_flattener_; // Weak. 59 60 DISALLOW_COPY_AND_ASSIGN(HistogramSnapshotManager); 61}; 62 63} // namespace base 64 65#endif // BASE_METRICS_HISTOGRAM_SNAPSHOT_MANAGER_H_ 66