blob: 8ae7447adec3c8ec51280f0697ef01266103dc8e [file] [log] [blame]
license.botbf09a502008-08-24 00:55:551// 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.
initial.commitd7cae122008-07-26 21:49:384
5#include "base/tracked.h"
6
[email protected]f1633932010-08-17 23:05:287#include "base/stringprintf.h"
initial.commitd7cae122008-07-26 21:49:388#include "base/tracked_objects.h"
9
[email protected]85632fa2010-05-10 16:35:4710using base::TimeTicks;
[email protected]e1acf6f2008-10-27 20:43:3311
initial.commitd7cae122008-07-26 21:49:3812namespace tracked_objects {
13
14//------------------------------------------------------------------------------
[email protected]3a3d47472010-07-15 21:03:5415
16Location::Location(const char* function_name, const char* file_name,
17 int line_number)
18 : function_name_(function_name),
19 file_name_(file_name),
20 line_number_(line_number) {
21}
22
23Location::Location()
24 : function_name_("Unknown"),
25 file_name_("Unknown"),
26 line_number_(-1) {
27}
28
initial.commitd7cae122008-07-26 21:49:3829void Location::Write(bool display_filename, bool display_function_name,
30 std::string* output) const {
[email protected]f1633932010-08-17 23:05:2831 base::StringAppendF(output, "%s[%d] ",
initial.commitd7cae122008-07-26 21:49:3832 display_filename ? file_name_ : "line",
33 line_number_);
34
35 if (display_function_name) {
36 WriteFunctionName(output);
37 output->push_back(' ');
38 }
39}
40
41void Location::WriteFunctionName(std::string* output) const {
42 // Translate "<" to "&lt;" for HTML safety.
43 // TODO(jar): Support ASCII or html for logging in ASCII.
44 for (const char *p = function_name_; *p; p++) {
45 switch (*p) {
46 case '<':
47 output->append("&lt;");
48 break;
49
50 case '>':
51 output->append("&gt;");
52 break;
53
54 default:
55 output->push_back(*p);
56 break;
57 }
58 }
59}
60
61//------------------------------------------------------------------------------
62
63#ifndef TRACK_ALL_TASK_OBJECTS
64
65Tracked::Tracked() {}
66Tracked::~Tracked() {}
67void Tracked::SetBirthPlace(const Location& from_here) {}
68bool Tracked::MissingBirthplace() const { return false; }
[email protected]cd542e12008-08-01 22:14:0669void Tracked::ResetBirthTime() {}
initial.commitd7cae122008-07-26 21:49:3870
71#else
72
[email protected]85632fa2010-05-10 16:35:4773Tracked::Tracked()
74 : tracked_births_(NULL),
75 tracked_birth_time_(TimeTicks::Now()) {
initial.commitd7cae122008-07-26 21:49:3876 if (!ThreadData::IsActive())
77 return;
78 SetBirthPlace(Location("NoFunctionName", "NeedToSetBirthPlace", -1));
79}
80
81Tracked::~Tracked() {
82 if (!ThreadData::IsActive() || !tracked_births_)
83 return;
84 ThreadData::current()->TallyADeath(*tracked_births_,
[email protected]85632fa2010-05-10 16:35:4785 TimeTicks::Now() - tracked_birth_time_);
initial.commitd7cae122008-07-26 21:49:3886}
87
88void Tracked::SetBirthPlace(const Location& from_here) {
89 if (!ThreadData::IsActive())
90 return;
91 if (tracked_births_)
92 tracked_births_->ForgetBirth();
93 ThreadData* current_thread_data = ThreadData::current();
94 if (!current_thread_data)
95 return; // Shutdown started, and this thread wasn't registered.
[email protected]75b79202009-12-30 07:31:4596 tracked_births_ = current_thread_data->TallyABirth(from_here);
initial.commitd7cae122008-07-26 21:49:3897}
98
[email protected]ee73678e2008-08-01 21:55:1799void Tracked::ResetBirthTime() {
[email protected]85632fa2010-05-10 16:35:47100 tracked_birth_time_ = TimeTicks::Now();
[email protected]ee73678e2008-08-01 21:55:17101}
102
initial.commitd7cae122008-07-26 21:49:38103bool Tracked::MissingBirthplace() const {
104 return -1 == tracked_births_->location().line_number();
105}
106
107#endif // NDEBUG
108
109} // namespace tracked_objects