| Index: chrome/browser/metrics/subprocess_metrics_provider.h
 | 
| diff --git a/chrome/browser/metrics/subprocess_metrics_provider.h b/chrome/browser/metrics/subprocess_metrics_provider.h
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..684ce195acf186da09ba648ad7eb7b2fe02dc862
 | 
| --- /dev/null
 | 
| +++ b/chrome/browser/metrics/subprocess_metrics_provider.h
 | 
| @@ -0,0 +1,97 @@
 | 
| +// Copyright 2016 The Chromium Authors. All rights reserved.
 | 
| +// Use of this source code is governed by a BSD-style license that can be
 | 
| +// found in the LICENSE file.
 | 
| +
 | 
| +#ifndef CHROME_BROWSER_METRICS_SUBPROCESS_METRICS_PROVIDER_H_
 | 
| +#define CHROME_BROWSER_METRICS_SUBPROCESS_METRICS_PROVIDER_H_
 | 
| +
 | 
| +#include <memory>
 | 
| +#include <set>
 | 
| +
 | 
| +#include "base/gtest_prod_util.h"
 | 
| +#include "base/id_map.h"
 | 
| +#include "base/scoped_observer.h"
 | 
| +#include "base/threading/thread_checker.h"
 | 
| +#include "components/metrics/metrics_provider.h"
 | 
| +#include "content/public/browser/notification_observer.h"
 | 
| +#include "content/public/browser/notification_registrar.h"
 | 
| +#include "content/public/browser/render_process_host_observer.h"
 | 
| +
 | 
| +namespace base {
 | 
| +class PersistentHistogramAllocator;
 | 
| +class SharedPersistentMemoryAllocator;
 | 
| +}
 | 
| +
 | 
| +// SubprocessMetricsProvider gathers and logs histograms stored in shared
 | 
| +// memory segments between processes.
 | 
| +class SubprocessMetricsProvider : public metrics::MetricsProvider,
 | 
| +                                  public content::NotificationObserver,
 | 
| +                                  public content::RenderProcessHostObserver {
 | 
| + public:
 | 
| +  SubprocessMetricsProvider();
 | 
| +  ~SubprocessMetricsProvider() override;
 | 
| +
 | 
| + private:
 | 
| +  friend class SubprocessMetricsProviderTest;
 | 
| +
 | 
| +  // Indicates subprocess to be monitored with unique id for later reference.
 | 
| +  // Metrics reporting will read histograms from it and upload them to UMA.
 | 
| +  void RegisterSubprocessAllocator(
 | 
| +      int id,
 | 
| +      std::unique_ptr<base::PersistentHistogramAllocator> allocator);
 | 
| +
 | 
| +  // Indicates that a subprocess has exited and is thus finished with the
 | 
| +  // allocator it was using.
 | 
| +  void DeregisterSubprocessAllocator(int id);
 | 
| +
 | 
| +  // Report all histograms of a given allocator to the snapshot-manager.
 | 
| +  void RecordHistogramSnapshotsFromAllocator(
 | 
| +      base::HistogramSnapshotManager* snapshot_manager,
 | 
| +      int id,
 | 
| +      base::PersistentHistogramAllocator* allocator);
 | 
| +
 | 
| +  // metrics::MetricsProvider:
 | 
| +  void OnRecordingEnabled() override;
 | 
| +  void OnRecordingDisabled() override;
 | 
| +  void RecordHistogramSnapshots(
 | 
| +      base::HistogramSnapshotManager* snapshot_manager) override;
 | 
| +
 | 
| +  // content::NotificationObserver:
 | 
| +  void Observe(int type,
 | 
| +               const content::NotificationSource& source,
 | 
| +               const content::NotificationDetails& details) override;
 | 
| +
 | 
| +  // content::RenderProcessHostObserver:
 | 
| +  void RenderProcessReady(content::RenderProcessHost* host) override;
 | 
| +  void RenderProcessExited(content::RenderProcessHost* host,
 | 
| +                           base::TerminationStatus status,
 | 
| +                           int exit_code) override;
 | 
| +  void RenderProcessHostDestroyed(content::RenderProcessHost* host) override;
 | 
| +
 | 
| +  base::ThreadChecker thread_checker_;
 | 
| +
 | 
| +  // Object for registing notification requests.
 | 
| +  content::NotificationRegistrar registrar_;
 | 
| +
 | 
| +  // All of the shared-persistent-allocators for known sub-processes.
 | 
| +  using AllocatorByIdMap =
 | 
| +      IDMap<base::PersistentHistogramAllocator, IDMapOwnPointer, int>;
 | 
| +  AllocatorByIdMap allocators_by_id_;
 | 
| +
 | 
| +  // Allocators that are no longer attached to a subprocess, to be released
 | 
| +  // once the last data contained therein has been reported.
 | 
| +  std::vector<std::unique_ptr<base::PersistentHistogramAllocator>>
 | 
| +      allocators_to_release_;
 | 
| +
 | 
| +  // Track all observed render processes to un-observe them on exit.
 | 
| +  ScopedObserver<content::RenderProcessHost, SubprocessMetricsProvider>
 | 
| +      scoped_observer_;
 | 
| +
 | 
| +  // Flag indicating if metrics recording is enabled. Allocators will not
 | 
| +  // live past the death of the subprocess if it is not.
 | 
| +  bool metrics_recording_enabled_ = false;
 | 
| +
 | 
| +  DISALLOW_COPY_AND_ASSIGN(SubprocessMetricsProvider);
 | 
| +};
 | 
| +
 | 
| +#endif  // CHROME_BROWSER_METRICS_SUBPROCESS_METRICS_PROVIDER_H_
 | 
| 
 |