Home | History | Annotate | Download | only in base
      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 
     10 using base::Time;
     11 
     12 namespace tracked_objects {
     13 
     14 //------------------------------------------------------------------------------
     15 void 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 
     27 void Location::WriteFunctionName(std::string* output) const {
     28   // Translate "<" to "&lt;" 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("&lt;");
     34         break;
     35 
     36       case '>':
     37         output->append("&gt;");
     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 
     51 Tracked::Tracked() {}
     52 Tracked::~Tracked() {}
     53 void Tracked::SetBirthPlace(const Location& from_here) {}
     54 bool Tracked::MissingBirthplace() const { return false; }
     55 void Tracked::ResetBirthTime() {}
     56 
     57 #else
     58 
     59 Tracked::Tracked() : tracked_births_(NULL), tracked_birth_time_(Time::Now()) {
     60   if (!ThreadData::IsActive())
     61     return;
     62   SetBirthPlace(Location("NoFunctionName", "NeedToSetBirthPlace", -1));
     63 }
     64 
     65 Tracked::~Tracked() {
     66   if (!ThreadData::IsActive() || !tracked_births_)
     67     return;
     68   ThreadData::current()->TallyADeath(*tracked_births_,
     69                                      Time::Now() - tracked_birth_time_);
     70 }
     71 
     72 void 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 
     83 void Tracked::ResetBirthTime() {
     84   tracked_birth_time_ = Time::Now();
     85 }
     86 
     87 bool Tracked::MissingBirthplace() const {
     88   return -1 == tracked_births_->location().line_number();
     89 }
     90 
     91 #endif  // NDEBUG
     92 
     93 }  // namespace tracked_objects
     94