// Copyright 2012 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CONTENT_BROWSER_METRICS_HISTOGRAM_SYNCHRONIZER_H_ #define CONTENT_BROWSER_METRICS_HISTOGRAM_SYNCHRONIZER_H_ #include <string> #include <vector> #include "base/functional/callback.h" #include "base/memory/singleton.h" #include "base/synchronization/lock.h" #include "base/task/task_runner.h" #include "base/time/time.h" #include "components/metrics/histogram_subscriber.h" namespace content { // This class maintains state that is used to upload histogram data from the // various child processes, into the browser process. Such transactions are // usually instigated by the browser. In general, a child process will respond // by gathering snapshots of all internal histograms, calculating what has // changed since its last upload, and transmitting a pickled collection of // deltas. // // There are actually two modes of update request. One is synchronous (and // blocks the UI thread, waiting to populate an about:histograms tab) and the // other is asynchronous, and used by the metrics services in preparation for a // log upload. // // To assure that all the processes have responded, a counter is maintained to // indicate the number of pending (not yet responsive) processes. To avoid // confusion about a response (i.e., is the process responding to a current // request for an update, or to an old request for an update) we tag each group // of requests with a sequence number. When an update arrives we can ignore it // (relative to the counter) if it does not relate to a current outstanding // sequence number. // // There is one final mode of use, where a renderer spontaneously decides to // transmit a collection of histogram data. This is designed for use when the // renderer is terminating. Unfortunately, renders may be terminated without // warning, and the best we can do is periodically acquire data from a tab, such // as when a page load has completed. In this mode, the renderer uses a // reserved sequence number, different from any sequence number that might be // specified by a browser request. Since this sequence number can't match an // outstanding sequence number, the pickled data is accepted into the browser, // but there is no impact on the counters. class HistogramSynchronizer : public metrics::HistogramSubscriber { … }; } // namespace content #endif // CONTENT_BROWSER_METRICS_HISTOGRAM_SYNCHRONIZER_H_