Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(343)

Side by Side Diff: base/metrics/sparse_histogram.cc

Issue 1180693002: Update from https://crrev.com/333737 (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: rebased Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « base/metrics/sparse_histogram.h ('k') | base/metrics/sparse_histogram_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/metrics/sparse_histogram.h" 5 #include "base/metrics/sparse_histogram.h"
6 6
7 #include "base/metrics/sample_map.h" 7 #include "base/metrics/sample_map.h"
8 #include "base/metrics/statistics_recorder.h" 8 #include "base/metrics/statistics_recorder.h"
9 #include "base/pickle.h" 9 #include "base/pickle.h"
10 #include "base/strings/stringprintf.h" 10 #include "base/strings/stringprintf.h"
11 #include "base/synchronization/lock.h" 11 #include "base/synchronization/lock.h"
12 12
13 using std::map;
14 using std::string;
15
16 namespace base { 13 namespace base {
17 14
18 typedef HistogramBase::Count Count; 15 typedef HistogramBase::Count Count;
19 typedef HistogramBase::Sample Sample; 16 typedef HistogramBase::Sample Sample;
20 17
21 // static 18 // static
22 HistogramBase* SparseHistogram::FactoryGet(const string& name, int32 flags) { 19 HistogramBase* SparseHistogram::FactoryGet(const std::string& name,
20 int32 flags) {
23 HistogramBase* histogram = StatisticsRecorder::FindHistogram(name); 21 HistogramBase* histogram = StatisticsRecorder::FindHistogram(name);
24 22
25 if (!histogram) { 23 if (!histogram) {
26 // To avoid racy destruction at shutdown, the following will be leaked. 24 // To avoid racy destruction at shutdown, the following will be leaked.
27 HistogramBase* tentative_histogram = new SparseHistogram(name); 25 HistogramBase* tentative_histogram = new SparseHistogram(name);
28 tentative_histogram->SetFlags(flags); 26 tentative_histogram->SetFlags(flags);
29 histogram = 27 histogram =
30 StatisticsRecorder::RegisterOrDeleteDuplicate(tentative_histogram); 28 StatisticsRecorder::RegisterOrDeleteDuplicate(tentative_histogram);
31 } 29 }
32 DCHECK_EQ(SPARSE_HISTOGRAM, histogram->GetHistogramType()); 30 DCHECK_EQ(SPARSE_HISTOGRAM, histogram->GetHistogramType());
(...skipping 30 matching lines...) Expand all
63 void SparseHistogram::AddSamples(const HistogramSamples& samples) { 61 void SparseHistogram::AddSamples(const HistogramSamples& samples) {
64 base::AutoLock auto_lock(lock_); 62 base::AutoLock auto_lock(lock_);
65 samples_.Add(samples); 63 samples_.Add(samples);
66 } 64 }
67 65
68 bool SparseHistogram::AddSamplesFromPickle(PickleIterator* iter) { 66 bool SparseHistogram::AddSamplesFromPickle(PickleIterator* iter) {
69 base::AutoLock auto_lock(lock_); 67 base::AutoLock auto_lock(lock_);
70 return samples_.AddFromPickle(iter); 68 return samples_.AddFromPickle(iter);
71 } 69 }
72 70
73 void SparseHistogram::WriteHTMLGraph(string* output) const { 71 void SparseHistogram::WriteHTMLGraph(std::string* output) const {
74 output->append("<PRE>"); 72 output->append("<PRE>");
75 WriteAsciiImpl(true, "<br>", output); 73 WriteAsciiImpl(true, "<br>", output);
76 output->append("</PRE>"); 74 output->append("</PRE>");
77 } 75 }
78 76
79 void SparseHistogram::WriteAscii(string* output) const { 77 void SparseHistogram::WriteAscii(std::string* output) const {
80 WriteAsciiImpl(true, "\n", output); 78 WriteAsciiImpl(true, "\n", output);
81 } 79 }
82 80
83 bool SparseHistogram::SerializeInfoImpl(Pickle* pickle) const { 81 bool SparseHistogram::SerializeInfoImpl(Pickle* pickle) const {
84 return pickle->WriteString(histogram_name()) && pickle->WriteInt(flags()); 82 return pickle->WriteString(histogram_name()) && pickle->WriteInt(flags());
85 } 83 }
86 84
87 SparseHistogram::SparseHistogram(const string& name) 85 SparseHistogram::SparseHistogram(const std::string& name)
88 : HistogramBase(name) {} 86 : HistogramBase(name) {}
89 87
90 HistogramBase* SparseHistogram::DeserializeInfoImpl(PickleIterator* iter) { 88 HistogramBase* SparseHistogram::DeserializeInfoImpl(PickleIterator* iter) {
91 string histogram_name; 89 std::string histogram_name;
92 int flags; 90 int flags;
93 if (!iter->ReadString(&histogram_name) || !iter->ReadInt(&flags)) { 91 if (!iter->ReadString(&histogram_name) || !iter->ReadInt(&flags)) {
94 DLOG(ERROR) << "Pickle error decoding Histogram: " << histogram_name; 92 DLOG(ERROR) << "Pickle error decoding Histogram: " << histogram_name;
95 return NULL; 93 return NULL;
96 } 94 }
97 95
98 DCHECK(flags & HistogramBase::kIPCSerializationSourceFlag); 96 DCHECK(flags & HistogramBase::kIPCSerializationSourceFlag);
99 flags &= ~HistogramBase::kIPCSerializationSourceFlag; 97 flags &= ~HistogramBase::kIPCSerializationSourceFlag;
100 98
101 return SparseHistogram::FactoryGet(histogram_name, flags); 99 return SparseHistogram::FactoryGet(histogram_name, flags);
(...skipping 20 matching lines...) Expand all
122 WriteAsciiHeader(total_count, output); 120 WriteAsciiHeader(total_count, output);
123 output->append(newline); 121 output->append(newline);
124 122
125 // Determine how wide the largest bucket range is (how many digits to print), 123 // Determine how wide the largest bucket range is (how many digits to print),
126 // so that we'll be able to right-align starts for the graphical bars. 124 // so that we'll be able to right-align starts for the graphical bars.
127 // Determine which bucket has the largest sample count so that we can 125 // Determine which bucket has the largest sample count so that we can
128 // normalize the graphical bar-width relative to that sample count. 126 // normalize the graphical bar-width relative to that sample count.
129 Count largest_count = 0; 127 Count largest_count = 0;
130 Sample largest_sample = 0; 128 Sample largest_sample = 0;
131 scoped_ptr<SampleCountIterator> it = snapshot->Iterator(); 129 scoped_ptr<SampleCountIterator> it = snapshot->Iterator();
132 while (!it->Done()) 130 while (!it->Done()) {
133 {
134 Sample min; 131 Sample min;
135 Sample max; 132 Sample max;
136 Count count; 133 Count count;
137 it->Get(&min, &max, &count); 134 it->Get(&min, &max, &count);
138 if (min > largest_sample) 135 if (min > largest_sample)
139 largest_sample = min; 136 largest_sample = min;
140 if (count > largest_count) 137 if (count > largest_count)
141 largest_count = count; 138 largest_count = count;
142 it->Next(); 139 it->Next();
143 } 140 }
144 size_t print_width = GetSimpleAsciiBucketRange(largest_sample).size() + 1; 141 size_t print_width = GetSimpleAsciiBucketRange(largest_sample).size() + 1;
145 142
146 // iterate over each item and display them 143 // iterate over each item and display them
147 it = snapshot->Iterator(); 144 it = snapshot->Iterator();
148 while (!it->Done()) 145 while (!it->Done()) {
149 {
150 Sample min; 146 Sample min;
151 Sample max; 147 Sample max;
152 Count count; 148 Count count;
153 it->Get(&min, &max, &count); 149 it->Get(&min, &max, &count);
154 150
155 // value is min, so display it 151 // value is min, so display it
156 string range = GetSimpleAsciiBucketRange(min); 152 std::string range = GetSimpleAsciiBucketRange(min);
157 output->append(range); 153 output->append(range);
158 for (size_t j = 0; range.size() + j < print_width + 1; ++j) 154 for (size_t j = 0; range.size() + j < print_width + 1; ++j)
159 output->push_back(' '); 155 output->push_back(' ');
160 156
161 if (graph_it) 157 if (graph_it)
162 WriteAsciiBucketGraph(count, largest_count, output); 158 WriteAsciiBucketGraph(count, largest_count, output);
163 WriteAsciiBucketValue(count, scaled_total_count, output); 159 WriteAsciiBucketValue(count, scaled_total_count, output);
164 output->append(newline); 160 output->append(newline);
165 it->Next(); 161 it->Next();
166 } 162 }
167 } 163 }
168 164
169 void SparseHistogram::WriteAsciiHeader(const Count total_count, 165 void SparseHistogram::WriteAsciiHeader(const Count total_count,
170 std::string* output) const { 166 std::string* output) const {
171 StringAppendF(output, 167 StringAppendF(output,
172 "Histogram: %s recorded %d samples", 168 "Histogram: %s recorded %d samples",
173 histogram_name().c_str(), 169 histogram_name().c_str(),
174 total_count); 170 total_count);
175 if (flags() & ~kHexRangePrintingFlag) 171 if (flags() & ~kHexRangePrintingFlag)
176 StringAppendF(output, " (flags = 0x%x)", flags() & ~kHexRangePrintingFlag); 172 StringAppendF(output, " (flags = 0x%x)", flags() & ~kHexRangePrintingFlag);
177 } 173 }
178 174
179 } // namespace base 175 } // namespace base
OLDNEW
« no previous file with comments | « base/metrics/sparse_histogram.h ('k') | base/metrics/sparse_histogram_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698