// Copyright 2015 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 "cc/base/histograms.h" #include #include #include #include #include "base/lazy_instance.h" #include "base/logging.h" #include "base/numerics/safe_conversions.h" #include "base/synchronization/lock.h" namespace cc { // Global data tracking the client name that was set. // Both of these variables are protected by the lock. static base::LazyInstance::Leaky g_client_name_lock = LAZY_INSTANCE_INITIALIZER; static const char* g_client_name = nullptr; static bool g_multiple_client_names_set = false; void SetClientNameForMetrics(const char* client_name) { base::AutoLock auto_lock(g_client_name_lock.Get()); // Only warn once. if (g_multiple_client_names_set) return; // If a different name is set, return nullptr from now on and log a warning. const char* old_client_name = g_client_name; if (old_client_name && strcmp(old_client_name, client_name)) { g_client_name = nullptr; g_multiple_client_names_set = true; LOG(WARNING) << "Started multiple compositor clients (" << old_client_name << ", " << client_name << ") in one process. Some metrics will be disabled."; return; } // If the client name is being set for the first time, store it. if (!old_client_name) g_client_name = client_name; } const char* GetClientNameForMetrics() { base::AutoLock auto_lock(g_client_name_lock.Get()); return g_client_name; } // Minimum elapsed time of 1us to limit weighting of fast calls. static const int64 kMinimumTimeMicroseconds = 1; ScopedUMAHistogramAreaTimerBase::ScopedUMAHistogramAreaTimerBase() : area_(0) { } ScopedUMAHistogramAreaTimerBase::~ScopedUMAHistogramAreaTimerBase() { } bool ScopedUMAHistogramAreaTimerBase::GetHistogramValues( Sample* time_microseconds, Sample* pixels_per_ms) const { return GetHistogramValues( timer_.Elapsed(), area_.ValueOrDefault(std::numeric_limits::max()), time_microseconds, pixels_per_ms); } // static bool ScopedUMAHistogramAreaTimerBase::GetHistogramValues( base::TimeDelta elapsed, int area, Sample* time_microseconds, Sample* pixels_per_ms) { elapsed = std::max( elapsed, base::TimeDelta::FromMicroseconds(kMinimumTimeMicroseconds)); double area_per_time = area / elapsed.InMillisecondsF(); // It is not clear how NaN can get here, but we've gotten crashes from // saturated_cast. http://crbug.com/486214 if (std::isnan(area_per_time)) return false; *time_microseconds = base::saturated_cast(elapsed.InMicroseconds()); *pixels_per_ms = base::saturated_cast(area_per_time); return true; } } // namespace cc