| Index: base/metrics/stats_table.cc
|
| diff --git a/base/metrics/stats_table.cc b/base/metrics/stats_table.cc
|
| index 0e4cad9186f5fed1b9f89456e1ff0b7b82ff9365..bae2c96ffe8bba9a48926e6c6d1c5aed5185fb08 100644
|
| --- a/base/metrics/stats_table.cc
|
| +++ b/base/metrics/stats_table.cc
|
| @@ -278,6 +278,13 @@ StatsTable::~StatsTable() {
|
| global_table_ = NULL;
|
| }
|
|
|
| +int StatsTable::GetSlot() const {
|
| + TLSData* data = GetTLSData();
|
| + if (!data)
|
| + return 0;
|
| + return data->slot;
|
| +}
|
| +
|
| int StatsTable::RegisterThread(const std::string& name) {
|
| int slot = 0;
|
| if (!impl_)
|
| @@ -311,15 +318,121 @@ int StatsTable::RegisterThread(const std::string& name) {
|
| return slot;
|
| }
|
|
|
| -StatsTable::TLSData* StatsTable::GetTLSData() const {
|
| - TLSData* data =
|
| - static_cast<TLSData*>(tls_index_.Get());
|
| - if (!data)
|
| +int StatsTable::CountThreadsRegistered() const {
|
| + if (!impl_)
|
| + return 0;
|
| +
|
| + // Loop through the shared memory and count the threads that are active.
|
| + // We intentionally do not lock the table during the operation.
|
| + int count = 0;
|
| + for (int index = 1; index <= impl_->max_threads(); index++) {
|
| + char* name = impl_->thread_name(index);
|
| + if (*name != '\0')
|
| + count++;
|
| + }
|
| + return count;
|
| +}
|
| +
|
| +int StatsTable::FindCounter(const std::string& name) {
|
| + // Note: the API returns counters numbered from 1..N, although
|
| + // internally, the array is 0..N-1. This is so that we can return
|
| + // zero as "not found".
|
| + if (!impl_)
|
| + return 0;
|
| +
|
| + // Create a scope for our auto-lock.
|
| + {
|
| + AutoLock scoped_lock(counters_lock_);
|
| +
|
| + // Attempt to find the counter.
|
| + CountersMap::const_iterator iter;
|
| + iter = counters_.find(name);
|
| + if (iter != counters_.end())
|
| + return iter->second;
|
| + }
|
| +
|
| + // Counter does not exist, so add it.
|
| + return AddCounter(name);
|
| +}
|
| +
|
| +int* StatsTable::GetLocation(int counter_id, int slot_id) const {
|
| + if (!impl_)
|
| + return NULL;
|
| + if (slot_id > impl_->max_threads())
|
| return NULL;
|
|
|
| - DCHECK(data->slot);
|
| - DCHECK_EQ(data->table, this);
|
| - return data;
|
| + int* row = impl_->row(counter_id);
|
| + return &(row[slot_id-1]);
|
| +}
|
| +
|
| +const char* StatsTable::GetRowName(int index) const {
|
| + if (!impl_)
|
| + return NULL;
|
| +
|
| + return impl_->counter_name(index);
|
| +}
|
| +
|
| +int StatsTable::GetRowValue(int index) const {
|
| + return GetRowValue(index, 0);
|
| +}
|
| +
|
| +int StatsTable::GetRowValue(int index, int pid) const {
|
| + if (!impl_)
|
| + return 0;
|
| +
|
| + int rv = 0;
|
| + int* row = impl_->row(index);
|
| + for (int slot_id = 0; slot_id < impl_->max_threads(); slot_id++) {
|
| + if (pid == 0 || *impl_->thread_pid(slot_id) == pid)
|
| + rv += row[slot_id];
|
| + }
|
| + return rv;
|
| +}
|
| +
|
| +int StatsTable::GetCounterValue(const std::string& name) {
|
| + return GetCounterValue(name, 0);
|
| +}
|
| +
|
| +int StatsTable::GetCounterValue(const std::string& name, int pid) {
|
| + if (!impl_)
|
| + return 0;
|
| +
|
| + int row = FindCounter(name);
|
| + if (!row)
|
| + return 0;
|
| + return GetRowValue(row, pid);
|
| +}
|
| +
|
| +int StatsTable::GetMaxCounters() const {
|
| + if (!impl_)
|
| + return 0;
|
| + return impl_->max_counters();
|
| +}
|
| +
|
| +int StatsTable::GetMaxThreads() const {
|
| + if (!impl_)
|
| + return 0;
|
| + return impl_->max_threads();
|
| +}
|
| +
|
| +int* StatsTable::FindLocation(const char* name) {
|
| + // Get the static StatsTable
|
| + StatsTable *table = StatsTable::current();
|
| + if (!table)
|
| + return NULL;
|
| +
|
| + // Get the slot for this thread. Try to register
|
| + // it if none exists.
|
| + int slot = table->GetSlot();
|
| + if (!slot && !(slot = table->RegisterThread("")))
|
| + return NULL;
|
| +
|
| + // Find the counter id for the counter.
|
| + std::string str_name(name);
|
| + int counter = table->FindCounter(str_name);
|
| +
|
| + // Now we can find the location in the table.
|
| + return table->GetLocation(counter, slot);
|
| }
|
|
|
| void StatsTable::UnregisterThread() {
|
| @@ -351,28 +464,6 @@ void StatsTable::SlotReturnFunction(void* data) {
|
| }
|
| }
|
|
|
| -int StatsTable::CountThreadsRegistered() const {
|
| - if (!impl_)
|
| - return 0;
|
| -
|
| - // Loop through the shared memory and count the threads that are active.
|
| - // We intentionally do not lock the table during the operation.
|
| - int count = 0;
|
| - for (int index = 1; index <= impl_->max_threads(); index++) {
|
| - char* name = impl_->thread_name(index);
|
| - if (*name != '\0')
|
| - count++;
|
| - }
|
| - return count;
|
| -}
|
| -
|
| -int StatsTable::GetSlot() const {
|
| - TLSData* data = GetTLSData();
|
| - if (!data)
|
| - return 0;
|
| - return data->slot;
|
| -}
|
| -
|
| int StatsTable::FindEmptyThread() const {
|
| // Note: the API returns slots numbered from 1..N, although
|
| // internally, the array is 0..N-1. This is so that we can return
|
| @@ -418,28 +509,6 @@ int StatsTable::FindCounterOrEmptyRow(const std::string& name) const {
|
| return free_slot;
|
| }
|
|
|
| -int StatsTable::FindCounter(const std::string& name) {
|
| - // Note: the API returns counters numbered from 1..N, although
|
| - // internally, the array is 0..N-1. This is so that we can return
|
| - // zero as "not found".
|
| - if (!impl_)
|
| - return 0;
|
| -
|
| - // Create a scope for our auto-lock.
|
| - {
|
| - AutoLock scoped_lock(counters_lock_);
|
| -
|
| - // Attempt to find the counter.
|
| - CountersMap::const_iterator iter;
|
| - iter = counters_.find(name);
|
| - if (iter != counters_.end())
|
| - return iter->second;
|
| - }
|
| -
|
| - // Counter does not exist, so add it.
|
| - return AddCounter(name);
|
| -}
|
| -
|
| int StatsTable::AddCounter(const std::string& name) {
|
| if (!impl_)
|
| return 0;
|
| @@ -470,84 +539,15 @@ int StatsTable::AddCounter(const std::string& name) {
|
| return counter_id;
|
| }
|
|
|
| -int* StatsTable::GetLocation(int counter_id, int slot_id) const {
|
| - if (!impl_)
|
| - return NULL;
|
| - if (slot_id > impl_->max_threads())
|
| - return NULL;
|
| -
|
| - int* row = impl_->row(counter_id);
|
| - return &(row[slot_id-1]);
|
| -}
|
| -
|
| -const char* StatsTable::GetRowName(int index) const {
|
| - if (!impl_)
|
| - return NULL;
|
| -
|
| - return impl_->counter_name(index);
|
| -}
|
| -
|
| -int StatsTable::GetRowValue(int index, int pid) const {
|
| - if (!impl_)
|
| - return 0;
|
| -
|
| - int rv = 0;
|
| - int* row = impl_->row(index);
|
| - for (int slot_id = 0; slot_id < impl_->max_threads(); slot_id++) {
|
| - if (pid == 0 || *impl_->thread_pid(slot_id) == pid)
|
| - rv += row[slot_id];
|
| - }
|
| - return rv;
|
| -}
|
| -
|
| -int StatsTable::GetRowValue(int index) const {
|
| - return GetRowValue(index, 0);
|
| -}
|
| -
|
| -int StatsTable::GetCounterValue(const std::string& name, int pid) {
|
| - if (!impl_)
|
| - return 0;
|
| -
|
| - int row = FindCounter(name);
|
| - if (!row)
|
| - return 0;
|
| - return GetRowValue(row, pid);
|
| -}
|
| -
|
| -int StatsTable::GetCounterValue(const std::string& name) {
|
| - return GetCounterValue(name, 0);
|
| -}
|
| -
|
| -int StatsTable::GetMaxCounters() const {
|
| - if (!impl_)
|
| - return 0;
|
| - return impl_->max_counters();
|
| -}
|
| -
|
| -int StatsTable::GetMaxThreads() const {
|
| - if (!impl_)
|
| - return 0;
|
| - return impl_->max_threads();
|
| -}
|
| -
|
| -int* StatsTable::FindLocation(const char* name) {
|
| - // Get the static StatsTable
|
| - StatsTable *table = StatsTable::current();
|
| - if (!table)
|
| +StatsTable::TLSData* StatsTable::GetTLSData() const {
|
| + TLSData* data =
|
| + static_cast<TLSData*>(tls_index_.Get());
|
| + if (!data)
|
| return NULL;
|
|
|
| - // Get the slot for this thread. Try to register
|
| - // it if none exists.
|
| - int slot = table->GetSlot();
|
| - if (!slot && !(slot = table->RegisterThread("")))
|
| - return NULL;
|
| -
|
| - // Find the counter id for the counter.
|
| - std::string str_name(name);
|
| - int counter = table->FindCounter(str_name);
|
| -
|
| - // Now we can find the location in the table.
|
| - return table->GetLocation(counter, slot);
|
| + DCHECK(data->slot);
|
| + DCHECK_EQ(data->table, this);
|
| + return data;
|
| }
|
|
|
| } // namespace base
|
|
|