| // Copyright (c) 2010 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 "base/metrics/stats_counters.h" |
| |
| #include "base/logging.h" |
| |
| namespace base { |
| #if defined(__LB_SHELL__) || defined(COBALT) |
| // Intentionally no-ops. |
| StatsCounter::StatsCounter() { |
| } |
| StatsCounter::StatsCounter(const std::string& name) { |
| } |
| StatsCounter::~StatsCounter() { |
| } |
| void StatsCounter::Set(int value) { |
| } |
| void StatsCounter::Add(int value) { |
| } |
| int* StatsCounter::GetPtr() { |
| return NULL; |
| } |
| StatsCounterTimer::StatsCounterTimer(const std::string& name) { |
| } |
| StatsCounterTimer::~StatsCounterTimer() { |
| } |
| void StatsCounterTimer::Start() { |
| } |
| void StatsCounterTimer::Stop() { |
| } |
| bool StatsCounterTimer::Running() { |
| return false; |
| } |
| void StatsCounterTimer::AddTime(TimeDelta time) { |
| } |
| void StatsCounterTimer::Record() { |
| } |
| StatsRate::StatsRate(const std::string& name) : |
| StatsCounterTimer(name), counter_(name), largest_add_("") { |
| } |
| StatsRate::~StatsRate() { |
| } |
| void StatsRate::Add(int value) { |
| } |
| #else |
| |
| StatsCounter::StatsCounter(const std::string& name) |
| : counter_id_(-1) { |
| // We prepend the name with 'c:' to indicate that it is a counter. |
| if (StatsTable::current()) { |
| // TODO(mbelshe): name_ construction is racy and it may corrupt memory for |
| // static. |
| name_ = "c:"; |
| name_.append(name); |
| } |
| } |
| |
| StatsCounter::~StatsCounter() { |
| } |
| |
| void StatsCounter::Set(int value) { |
| int* loc = GetPtr(); |
| if (loc) |
| *loc = value; |
| } |
| |
| void StatsCounter::Add(int value) { |
| int* loc = GetPtr(); |
| if (loc) |
| (*loc) += value; |
| } |
| |
| StatsCounter::StatsCounter() |
| : counter_id_(-1) { |
| } |
| |
| int* StatsCounter::GetPtr() { |
| StatsTable* table = StatsTable::current(); |
| if (!table) |
| return NULL; |
| |
| // If counter_id_ is -1, then we haven't looked it up yet. |
| if (counter_id_ == -1) { |
| counter_id_ = table->FindCounter(name_); |
| if (table->GetSlot() == 0) { |
| if (!table->RegisterThread("")) { |
| // There is no room for this thread. This thread |
| // cannot use counters. |
| counter_id_ = 0; |
| return NULL; |
| } |
| } |
| } |
| |
| // If counter_id_ is > 0, then we have a valid counter. |
| if (counter_id_ > 0) |
| return table->GetLocation(counter_id_, table->GetSlot()); |
| |
| // counter_id_ was zero, which means the table is full. |
| return NULL; |
| } |
| |
| |
| StatsCounterTimer::StatsCounterTimer(const std::string& name) { |
| // we prepend the name with 't:' to indicate that it is a timer. |
| if (StatsTable::current()) { |
| // TODO(mbelshe): name_ construction is racy and it may corrupt memory for |
| // static. |
| name_ = "t:"; |
| name_.append(name); |
| } |
| } |
| |
| StatsCounterTimer::~StatsCounterTimer() { |
| } |
| |
| void StatsCounterTimer::Start() { |
| if (!Enabled()) |
| return; |
| start_time_ = TimeTicks::Now(); |
| stop_time_ = TimeTicks(); |
| } |
| |
| // Stop the timer and record the results. |
| void StatsCounterTimer::Stop() { |
| if (!Enabled() || !Running()) |
| return; |
| stop_time_ = TimeTicks::Now(); |
| Record(); |
| } |
| |
| // Returns true if the timer is running. |
| bool StatsCounterTimer::Running() { |
| return Enabled() && !start_time_.is_null() && stop_time_.is_null(); |
| } |
| |
| // Accept a TimeDelta to increment. |
| void StatsCounterTimer::AddTime(TimeDelta time) { |
| Add(static_cast<int>(time.InMilliseconds())); |
| } |
| |
| void StatsCounterTimer::Record() { |
| AddTime(stop_time_ - start_time_); |
| } |
| |
| |
| StatsRate::StatsRate(const std::string& name) |
| : StatsCounterTimer(name), |
| counter_(name), |
| largest_add_(std::string(" ").append(name).append("MAX")) { |
| } |
| |
| StatsRate::~StatsRate() { |
| } |
| |
| void StatsRate::Add(int value) { |
| counter_.Increment(); |
| StatsCounterTimer::Add(value); |
| if (value > largest_add_.value()) |
| largest_add_.Set(value); |
| } |
| #endif |
| } // namespace base |