// Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. //
// Default implementation of histogram methods for WebRTC clients that do not // want to provide their own implementation.
namespace webrtc { namespace metrics { class Histogram;
namespace { // Limit for the maximum number of sample values that can be stored. // TODO(asapersson): Consider using bucket count (and set up // linearly/exponentially spaced buckets) if samples are logged more frequently. constint kMaxSampleMapSize = 300;
class RtcHistogram { public:
RtcHistogram(absl::string_view name, int min, int max, int bucket_count)
: min_(min), max_(max), info_(name, min, max, bucket_count) {
RTC_DCHECK_GT(bucket_count, 0);
}
// Returns a copy (or nullptr if there are no samples) and clears samples.
std::unique_ptr<SampleInfo> GetAndReset() {
MutexLock lock(&mutex_); if (info_.samples.empty()) return nullptr;
SampleInfo* copy = new SampleInfo(info_.name, info_.min, info_.max, info_.bucket_count);
Histogram* GetCountsHistogram(absl::string_view name, int min, int max, int bucket_count) {
MutexLock lock(&mutex_); constauto& it = map_.find(name); if (it != map_.end()) returnreinterpret_cast<Histogram*>(it->second.get());
// RtcHistogramMap is allocated upon call to Enable(). // The histogram getter functions, which return pointer values to the histograms // in the map, are cached in WebRTC. Therefore, this memory is not freed by the // application (the memory will be reclaimed by the OS). static std::atomic<RtcHistogramMap*> g_rtc_histogram_map(nullptr);
void CreateMap() {
RtcHistogramMap* map = g_rtc_histogram_map.load(std::memory_order_acquire); if (map == nullptr) {
RtcHistogramMap* new_map = new RtcHistogramMap(); if (!g_rtc_histogram_map.compare_exchange_strong(map, new_map)) delete new_map;
}
}
// Set the first time we start using histograms. Used to make sure Enable() is // not called thereafter. #if RTC_DCHECK_IS_ON static std::atomic<int> g_rtc_histogram_called(0); #endif
#ifndef WEBRTC_EXCLUDE_METRICS_DEFAULT // Implementation of histogram methods in // webrtc/system_wrappers/interface/metrics.h.
// Histogram with exponentially spaced buckets. // Creates (or finds) histogram. // The returned histogram pointer is cached (and used for adding samples in // subsequent calls).
Histogram* HistogramFactoryGetCounts(absl::string_view name, int min, int max, int bucket_count) { // TODO(asapersson): Alternative implementation will be needed if this // histogram type should be truly exponential. return HistogramFactoryGetCountsLinear(name, min, max, bucket_count);
}
// Histogram with linearly spaced buckets. // Creates (or finds) histogram. // The returned histogram pointer is cached (and used for adding samples in // subsequent calls).
Histogram* HistogramFactoryGetCountsLinear(absl::string_view name, int min, int max, int bucket_count) {
RtcHistogramMap* map = GetMap(); if (!map) return nullptr;
// Histogram with linearly spaced buckets. // Creates (or finds) histogram. // The returned histogram pointer is cached (and used for adding samples in // subsequent calls).
Histogram* HistogramFactoryGetEnumeration(absl::string_view name, int boundary) {
RtcHistogramMap* map = GetMap(); if (!map) return nullptr;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.