tracked.cc revision c7f5f8508d98d5952d42ed7648c2a8f30a4da156
1// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "base/tracked.h" 6 7#include "base/string_util.h" 8#include "base/tracked_objects.h" 9 10using base::Time; 11 12namespace tracked_objects { 13 14//------------------------------------------------------------------------------ 15void Location::Write(bool display_filename, bool display_function_name, 16 std::string* output) const { 17 StringAppendF(output, "%s[%d] ", 18 display_filename ? file_name_ : "line", 19 line_number_); 20 21 if (display_function_name) { 22 WriteFunctionName(output); 23 output->push_back(' '); 24 } 25} 26 27void Location::WriteFunctionName(std::string* output) const { 28 // Translate "<" to "<" for HTML safety. 29 // TODO(jar): Support ASCII or html for logging in ASCII. 30 for (const char *p = function_name_; *p; p++) { 31 switch (*p) { 32 case '<': 33 output->append("<"); 34 break; 35 36 case '>': 37 output->append(">"); 38 break; 39 40 default: 41 output->push_back(*p); 42 break; 43 } 44 } 45} 46 47//------------------------------------------------------------------------------ 48 49#ifndef TRACK_ALL_TASK_OBJECTS 50 51Tracked::Tracked() {} 52Tracked::~Tracked() {} 53void Tracked::SetBirthPlace(const Location& from_here) {} 54bool Tracked::MissingBirthplace() const { return false; } 55void Tracked::ResetBirthTime() {} 56 57#else 58 59Tracked::Tracked() : tracked_births_(NULL), tracked_birth_time_(Time::Now()) { 60 if (!ThreadData::IsActive()) 61 return; 62 SetBirthPlace(Location("NoFunctionName", "NeedToSetBirthPlace", -1)); 63} 64 65Tracked::~Tracked() { 66 if (!ThreadData::IsActive() || !tracked_births_) 67 return; 68 ThreadData::current()->TallyADeath(*tracked_births_, 69 Time::Now() - tracked_birth_time_); 70} 71 72void Tracked::SetBirthPlace(const Location& from_here) { 73 if (!ThreadData::IsActive()) 74 return; 75 if (tracked_births_) 76 tracked_births_->ForgetBirth(); 77 ThreadData* current_thread_data = ThreadData::current(); 78 if (!current_thread_data) 79 return; // Shutdown started, and this thread wasn't registered. 80 tracked_births_ = current_thread_data->TallyABirth(from_here); 81} 82 83void Tracked::ResetBirthTime() { 84 tracked_birth_time_ = Time::Now(); 85} 86 87bool Tracked::MissingBirthplace() const { 88 return -1 == tracked_births_->location().line_number(); 89} 90 91#endif // NDEBUG 92 93} // namespace tracked_objects 94