| Index: chrome/browser/metrics/subprocess_metrics_provider.cc
|
| diff --git a/chrome/browser/metrics/subprocess_metrics_provider.cc b/chrome/browser/metrics/subprocess_metrics_provider.cc
|
| deleted file mode 100644
|
| index 6d0365d58c7da0ad838ffc4057c5018ac164830b..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/metrics/subprocess_metrics_provider.cc
|
| +++ /dev/null
|
| @@ -1,165 +0,0 @@
|
| -// 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.
|
| -
|
| -#include "chrome/browser/metrics/subprocess_metrics_provider.h"
|
| -
|
| -#include "base/logging.h"
|
| -#include "base/memory/ptr_util.h"
|
| -#include "base/metrics/histogram_base.h"
|
| -#include "base/metrics/histogram_macros.h"
|
| -#include "base/metrics/persistent_histogram_allocator.h"
|
| -#include "base/metrics/persistent_memory_allocator.h"
|
| -#include "components/metrics/metrics_service.h"
|
| -#include "content/public/browser/notification_service.h"
|
| -#include "content/public/browser/notification_types.h"
|
| -#include "content/public/browser/render_process_host.h"
|
| -
|
| -SubprocessMetricsProvider::SubprocessMetricsProvider()
|
| - : scoped_observer_(this) {
|
| - registrar_.Add(this, content::NOTIFICATION_RENDERER_PROCESS_CREATED,
|
| - content::NotificationService::AllBrowserContextsAndSources());
|
| -}
|
| -
|
| -SubprocessMetricsProvider::~SubprocessMetricsProvider() {}
|
| -
|
| -void SubprocessMetricsProvider::RegisterSubprocessAllocator(
|
| - int id,
|
| - std::unique_ptr<base::PersistentHistogramAllocator> allocator) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - DCHECK(!allocators_by_id_.Lookup(id));
|
| -
|
| - // Map is "MapOwnPointer" so transfer ownership to it.
|
| - allocators_by_id_.AddWithID(allocator.release(), id);
|
| -}
|
| -
|
| -void SubprocessMetricsProvider::DeregisterSubprocessAllocator(int id) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| -
|
| - if (!allocators_by_id_.Lookup(id))
|
| - return;
|
| -
|
| - // Extract the matching allocator from the list of active ones.
|
| - std::unique_ptr<base::PersistentHistogramAllocator> allocator(
|
| - allocators_by_id_.Replace(id, nullptr));
|
| - allocators_by_id_.Remove(id);
|
| - DCHECK(allocator);
|
| -
|
| - // If metrics recording is enabled, transfer the allocator to the "release"
|
| - // list. The allocator will continue to live (and keep the associated shared
|
| - // memory alive) until the next upload after which it will be released.
|
| - // Otherwise, the allocator and its memory will be released when the
|
| - // unique_ptr goes out of scope at the end of this method.
|
| - if (metrics_recording_enabled_)
|
| - allocators_to_release_.push_back(std::move(allocator));
|
| -}
|
| -
|
| -void SubprocessMetricsProvider::OnRecordingEnabled() {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| -
|
| - metrics_recording_enabled_ = true;
|
| -}
|
| -
|
| -void SubprocessMetricsProvider::OnRecordingDisabled() {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| -
|
| - metrics_recording_enabled_ = false;
|
| - allocators_to_release_.clear();
|
| -}
|
| -
|
| -void SubprocessMetricsProvider::RecordHistogramSnapshotsFromAllocator(
|
| - base::HistogramSnapshotManager* snapshot_manager,
|
| - int id,
|
| - base::PersistentHistogramAllocator* allocator) {
|
| - DCHECK(allocator);
|
| -
|
| - int histogram_count = 0;
|
| - base::PersistentHistogramAllocator::Iterator hist_iter(allocator);
|
| - while (true) {
|
| - std::unique_ptr<base::HistogramBase> histogram = hist_iter.GetNext();
|
| - if (!histogram)
|
| - break;
|
| - snapshot_manager->PrepareDeltaTakingOwnership(std::move(histogram));
|
| - ++histogram_count;
|
| - }
|
| -
|
| - DVLOG(1) << "Reported " << histogram_count << " histograms from subprocess #"
|
| - << id;
|
| -}
|
| -
|
| -void SubprocessMetricsProvider::RecordHistogramSnapshots(
|
| - base::HistogramSnapshotManager* snapshot_manager) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| -
|
| - for (AllocatorByIdMap::iterator iter(&allocators_by_id_); !iter.IsAtEnd();
|
| - iter.Advance()) {
|
| - RecordHistogramSnapshotsFromAllocator(
|
| - snapshot_manager, iter.GetCurrentKey(), iter.GetCurrentValue());
|
| - }
|
| -
|
| - for (auto& allocator : allocators_to_release_)
|
| - RecordHistogramSnapshotsFromAllocator(snapshot_manager, 0, allocator.get());
|
| -
|
| - UMA_HISTOGRAM_COUNTS_100(
|
| - "UMA.SubprocessMetricsProvider.SubprocessCount",
|
| - allocators_by_id_.size() + allocators_to_release_.size());
|
| -
|
| - // The snapshot-manager has taken ownership of the histograms but needs
|
| - // access to only the histogram objects, not "sample" data it uses. Thus,
|
| - // it is safe to release shared-memory segments without waiting for the
|
| - // snapshot-manager to "finish".
|
| - allocators_to_release_.clear();
|
| -}
|
| -
|
| -void SubprocessMetricsProvider::Observe(
|
| - int type,
|
| - const content::NotificationSource& source,
|
| - const content::NotificationDetails& details) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - DCHECK_EQ(content::NOTIFICATION_RENDERER_PROCESS_CREATED, type);
|
| -
|
| - content::RenderProcessHost* host =
|
| - content::Source<content::RenderProcessHost>(source).ptr();
|
| -
|
| - // Sometimes, the same host will cause multiple notifications in tests so
|
| - // could possibly do the same in a release build.
|
| - if (!scoped_observer_.IsObserving(host))
|
| - scoped_observer_.Add(host);
|
| -}
|
| -
|
| -void SubprocessMetricsProvider::RenderProcessReady(
|
| - content::RenderProcessHost* host) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| -
|
| - // If the render-process-host passed a persistent-memory-allocator to the
|
| - // renderer process, extract it and register it here.
|
| - std::unique_ptr<base::SharedPersistentMemoryAllocator> allocator =
|
| - host->TakeMetricsAllocator();
|
| - if (allocator) {
|
| - RegisterSubprocessAllocator(
|
| - host->GetID(),
|
| - WrapUnique(new base::PersistentHistogramAllocator(
|
| - std::move(allocator))));
|
| - }
|
| -}
|
| -
|
| -void SubprocessMetricsProvider::RenderProcessExited(
|
| - content::RenderProcessHost* host,
|
| - base::TerminationStatus status,
|
| - int exit_code) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| -
|
| - DeregisterSubprocessAllocator(host->GetID());
|
| -}
|
| -
|
| -void SubprocessMetricsProvider::RenderProcessHostDestroyed(
|
| - content::RenderProcessHost* host) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| -
|
| - // It's possible for a Renderer to terminate without RenderProcessExited
|
| - // (above) being called so it's necessary to de-register also upon the
|
| - // destruction of the host. If both get called, no harm is done.
|
| -
|
| - DeregisterSubprocessAllocator(host->GetID());
|
| - scoped_observer_.Remove(host);
|
| -}
|
|
|