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 "&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
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