Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(308)

Unified Diff: components/metrics/metrics_service.h

Issue 1425533011: Support "shared" histograms between processes. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@shmem-alloc
Patch Set: addressed review comments by Alexei Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: components/metrics/metrics_service.h
diff --git a/components/metrics/metrics_service.h b/components/metrics/metrics_service.h
index ce4102b8dfa36408fe037bd6772184d759a48a4e..33ecdda693eb55677238a43bbcf585381f839b29 100644
--- a/components/metrics/metrics_service.h
+++ b/components/metrics/metrics_service.h
@@ -22,6 +22,7 @@
#include "base/metrics/field_trial.h"
#include "base/metrics/histogram_flattener.h"
#include "base/metrics/histogram_snapshot_manager.h"
+#include "base/metrics/persistent_memory_allocator.h"
#include "base/metrics/user_metrics.h"
#include "base/observer_list.h"
#include "base/time/time.h"
@@ -40,6 +41,7 @@ namespace base {
class DictionaryValue;
class HistogramSamples;
class PrefService;
+class SharedMemoryAllocator;
}
namespace variations {
@@ -214,6 +216,16 @@ class MetricsService : public base::HistogramFlattener {
// Pushes a log that has been generated by an external component.
void PushExternalLog(const std::string& log);
+ // Add a persistent memory segment that contains histograms. Ownership
+ // of this object remains with the caller; it must be removed from here
+ // before being destroyed.
+ void AddPersistentMemorySegment(base::PersistentMemoryAllocator* alloc);
+
+ // Remove a persistent memory segment. This should be done only after
+ // a final reporting has been done to avoid data loss and incorrect
+ // reporting.
+ void RemovePersistentMemorySegment(base::PersistentMemoryAllocator* alloc);
+
protected:
// Exposed for testing.
MetricsLogManager* log_manager() { return &log_manager_; }
@@ -244,6 +256,7 @@ class MetricsService : public base::HistogramFlattener {
UNSET
};
+ typedef std::set<base::PersistentMemoryAllocator*> AllocatorSet;
typedef std::vector<variations::SyntheticTrialGroup> SyntheticTrialGroups;
// Registers a field trial name and group to be used to annotate a UMA report
@@ -256,6 +269,58 @@ class MetricsService : public base::HistogramFlattener {
void RegisterSyntheticFieldTrial(
const variations::SyntheticTrialGroup& trial_group);
+
+ // A class for iterating over the histograms in persistent memory segments.
+ // This is implemented as an STL-compatible iterator so it can be used in
+ // places that accept histograms both from here and from std containers.
+ class PersistentHistogramIterator {
+ // This class provides a reference-counted pointer to a histogram which
+ // is necessary for histogram objects that are dynamically generated
+ // (generally pointing to persistent memory) and to be owned by an STL
+ // iterator which, by necessity, must be copyable.
+ class HistogramPointer : public base::RefCounted<HistogramPointer> {
+ public:
+ HistogramPointer(base::HistogramBase* h) : histogram_(h) {}
+ base::HistogramBase* get() { return histogram_.get(); }
+
+ private:
+ scoped_ptr<base::HistogramBase> histogram_;
+ };
+
+ public:
+ PersistentHistogramIterator(AllocatorSet& allocators,
+ AllocatorSet::iterator pos);
+
+ PersistentHistogramIterator& operator++();
+ PersistentHistogramIterator operator++(int) {
+ PersistentHistogramIterator tmp(*this);
+ operator++();
+ return tmp;
+ }
+
+ bool operator==(const PersistentHistogramIterator& rhs) const {
+ return allocator_iter_ == rhs.allocator_iter_ &&
+ histogram_iter_ == rhs.histogram_iter_;
+ }
+ bool operator!=(const PersistentHistogramIterator& rhs) const {
+ return allocator_iter_ != rhs.allocator_iter_ ||
+ histogram_iter_ != rhs.histogram_iter_;
+ }
+ base::HistogramBase* operator*() {
+ return current_histogram_->get();
+ }
+
+ private:
+ AllocatorSet& allocators_;
+ AllocatorSet::iterator allocator_iter_;
+ base::PersistentMemoryAllocator::Iterator histogram_iter_;
+
+ // STL iterators must be copyable so a regular scoped_ptr is not
+ // sufficient as it doesn't allow such. A ref-counted one is needed.
+ scoped_refptr<HistogramPointer> current_histogram_;
+ };
+
+
// Calls into the client to initialize some system profile metrics.
void StartInitTask();
@@ -394,6 +459,10 @@ class MetricsService : public base::HistogramFlattener {
// upload or intentional sampling of logs.
void SkipAndDiscardUpload();
+ // Begin and End iterators for going through all the metrics under management.
+ PersistentHistogramIterator persistent_begin();
+ PersistentHistogramIterator persistent_end();
+
// Manager for the various in-flight logs.
MetricsLogManager log_manager_;
@@ -476,6 +545,7 @@ class MetricsService : public base::HistogramFlattener {
FRIEND_TEST_ALL_PREFIXES(MetricsServiceTest,
PermutedEntropyCacheClearedWhenLowEntropyReset);
FRIEND_TEST_ALL_PREFIXES(MetricsServiceTest, RegisterSyntheticTrial);
+ FRIEND_TEST_ALL_PREFIXES(MetricsServiceTest, MultiplePersistentAllocators);
// Weak pointers factory used to post task on different threads. All weak
// pointers managed by this factory have the same lifetime as MetricsService.
@@ -485,6 +555,9 @@ class MetricsService : public base::HistogramFlattener {
// this factory are invalidated in ScheduleNextStateSave.
base::WeakPtrFactory<MetricsService> state_saver_factory_;
+ // Persistent memory segments that contain histograms created elsewhere.
+ AllocatorSet allocators_;
+
DISALLOW_COPY_AND_ASSIGN(MetricsService);
};

Powered by Google App Engine
This is Rietveld 408576698