| Index: base/stats_counters.cc
|
| diff --git a/base/stats_counters.cc b/base/stats_counters.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..345e1d61bad70ff5bf8b6369cab06710fa449f29
|
| --- /dev/null
|
| +++ b/base/stats_counters.cc
|
| @@ -0,0 +1,113 @@
|
| +// 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/stats_counters.h"
|
| +
|
| +StatsCounter::StatsCounter(const std::string& name)
|
| + : counter_id_(-1) {
|
| + // We prepend the name with 'c:' to indicate that it is a counter.
|
| + 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.
|
| + name_ = "t:";
|
| + name_.append(name);
|
| +}
|
| +
|
| +StatsCounterTimer::~StatsCounterTimer() {
|
| +}
|
| +
|
| +void StatsCounterTimer::Start() {
|
| + if (!Enabled())
|
| + return;
|
| + start_time_ = base::TimeTicks::Now();
|
| + stop_time_ = base::TimeTicks();
|
| +}
|
| +
|
| +// Stop the timer and record the results.
|
| +void StatsCounterTimer::Stop() {
|
| + if (!Enabled() || !Running())
|
| + return;
|
| + stop_time_ = base::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(base::TimeDelta time) {
|
| + Add(static_cast<int>(time.InMilliseconds()));
|
| +}
|
| +
|
| +void StatsCounterTimer::Record() {
|
| + AddTime(stop_time_ - start_time_);
|
| +}
|
| +
|
| +
|
| +StatsRate::StatsRate(const char* name)
|
| + : StatsCounterTimer(name),
|
| + counter_(name),
|
| + largest_add_(std::string(" ").append(name).append("MAX").c_str()) {
|
| +}
|
| +
|
| +StatsRate::~StatsRate() {
|
| +}
|
| +
|
| +void StatsRate::Add(int value) {
|
| + counter_.Increment();
|
| + StatsCounterTimer::Add(value);
|
| + if (value > largest_add_.value())
|
| + largest_add_.Set(value);
|
| +}
|
|
|