Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 // Histogram is an object that aggregates statistics, and can summarize them in | 5 // Histogram is an object that aggregates statistics, and can summarize them in |
| 6 // various forms, including ASCII graphical, HTML, and numerically (as a | 6 // various forms, including ASCII graphical, HTML, and numerically (as a |
| 7 // vector of numbers corresponding to each of the aggregating buckets). | 7 // vector of numbers corresponding to each of the aggregating buckets). |
| 8 // See header file for details and examples. | 8 // See header file for details and examples. |
| 9 | 9 |
| 10 #include "base/metrics/histogram.h" | 10 #include "base/metrics/histogram.h" |
| (...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 232 Pickle pickle; | 232 Pickle pickle; |
| 233 pickle.WriteString(histogram.histogram_name()); | 233 pickle.WriteString(histogram.histogram_name()); |
| 234 pickle.WriteInt(histogram.declared_min()); | 234 pickle.WriteInt(histogram.declared_min()); |
| 235 pickle.WriteInt(histogram.declared_max()); | 235 pickle.WriteInt(histogram.declared_max()); |
| 236 pickle.WriteSize(histogram.bucket_count()); | 236 pickle.WriteSize(histogram.bucket_count()); |
| 237 pickle.WriteUInt32(histogram.range_checksum()); | 237 pickle.WriteUInt32(histogram.range_checksum()); |
| 238 pickle.WriteInt(histogram.histogram_type()); | 238 pickle.WriteInt(histogram.histogram_type()); |
| 239 pickle.WriteInt(histogram.flags()); | 239 pickle.WriteInt(histogram.flags()); |
| 240 | 240 |
| 241 snapshot.Serialize(&pickle); | 241 snapshot.Serialize(&pickle); |
| 242 | |
| 243 if (histogram.histogram_type() == CUSTOM_HISTOGRAM) | |
| 244 histogram.cached_ranges()->Serialize(&pickle); | |
|
jar (doing other things)
2011/11/11 19:43:38
Maybe this should be a call to a base class method
Ami GONE FROM CHROMIUM
2011/11/11 22:44:48
I think having Histogram have two methods, a stati
| |
| 245 | |
| 242 return std::string(static_cast<const char*>(pickle.data()), pickle.size()); | 246 return std::string(static_cast<const char*>(pickle.data()), pickle.size()); |
| 243 } | 247 } |
| 244 | 248 |
| 245 // static | 249 // static |
| 246 bool Histogram::DeserializeHistogramInfo(const std::string& histogram_info) { | 250 bool Histogram::DeserializeHistogramInfo(const std::string& histogram_info) { |
| 247 if (histogram_info.empty()) { | 251 if (histogram_info.empty()) { |
| 248 return false; | 252 return false; |
| 249 } | 253 } |
| 250 | 254 |
| 251 Pickle pickle(histogram_info.data(), | 255 Pickle pickle(histogram_info.data(), |
| 252 static_cast<int>(histogram_info.size())); | 256 static_cast<int>(histogram_info.size())); |
| 253 std::string histogram_name; | 257 std::string histogram_name; |
| 254 int declared_min; | 258 int declared_min; |
| 255 int declared_max; | 259 int declared_max; |
| 256 size_t bucket_count; | 260 size_t bucket_count; |
| 257 uint32 range_checksum; | 261 uint32 range_checksum; |
| 258 int histogram_type; | 262 int histogram_type; |
| 259 int pickle_flags; | 263 int pickle_flags; |
| 260 SampleSet sample; | 264 SampleSet sample; |
| 261 | 265 |
| 262 void* iter = NULL; | 266 void* iter = NULL; |
| 263 if (!pickle.ReadString(&iter, &histogram_name) || | 267 if (!pickle.ReadString(&iter, &histogram_name) || |
| 264 !pickle.ReadInt(&iter, &declared_min) || | 268 !pickle.ReadInt(&iter, &declared_min) || |
| 265 !pickle.ReadInt(&iter, &declared_max) || | 269 !pickle.ReadInt(&iter, &declared_max) || |
| 266 !pickle.ReadSize(&iter, &bucket_count) || | 270 !pickle.ReadSize(&iter, &bucket_count) || |
| 267 !pickle.ReadUInt32(&iter, &range_checksum) || | 271 !pickle.ReadUInt32(&iter, &range_checksum) || |
| 268 !pickle.ReadInt(&iter, &histogram_type) || | 272 !pickle.ReadInt(&iter, &histogram_type) || |
| 269 !pickle.ReadInt(&iter, &pickle_flags) || | 273 !pickle.ReadInt(&iter, &pickle_flags) || |
| 270 !sample.Histogram::SampleSet::Deserialize(&iter, pickle)) { | 274 !sample.Histogram::SampleSet::Deserialize(&iter, pickle)) { |
| 271 DLOG(ERROR) << "Pickle error decoding Histogram: " << histogram_name; | 275 DLOG(ERROR) << "Pickle error decoding Histogram: " << histogram_name; |
| 272 return false; | 276 return false; |
| 273 } | 277 } |
| 278 | |
| 279 std::vector<Histogram::Sample> sample_ranges; | |
| 280 if (histogram_type == CUSTOM_HISTOGRAM) { | |
| 281 CachedRanges ranges(bucket_count, 0); | |
| 282 if (!ranges.Deserialize(&iter, pickle) || | |
| 283 ranges.size() != bucket_count) { | |
| 284 DLOG(ERROR) << "Pickle error decoding ranges: " << histogram_name; | |
| 285 return false; | |
| 286 } | |
| 287 for (size_t i = 0; i < bucket_count; ++i) | |
| 288 sample_ranges.push_back(ranges.ranges(i)); | |
| 289 } | |
| 290 | |
| 274 DCHECK(pickle_flags & kIPCSerializationSourceFlag); | 291 DCHECK(pickle_flags & kIPCSerializationSourceFlag); |
| 275 // Since these fields may have come from an untrusted renderer, do additional | 292 // Since these fields may have come from an untrusted renderer, do additional |
| 276 // checks above and beyond those in Histogram::Initialize() | 293 // checks above and beyond those in Histogram::Initialize() |
| 277 if (declared_max <= 0 || declared_min <= 0 || declared_max < declared_min || | 294 if (declared_max <= 0 || declared_min <= 0 || declared_max < declared_min || |
| 278 INT_MAX / sizeof(Count) <= bucket_count || bucket_count < 2) { | 295 INT_MAX / sizeof(Count) <= bucket_count || bucket_count < 2) { |
| 279 DLOG(ERROR) << "Values error decoding Histogram: " << histogram_name; | 296 DLOG(ERROR) << "Values error decoding Histogram: " << histogram_name; |
| 280 return false; | 297 return false; |
| 281 } | 298 } |
| 282 | 299 |
| 283 Flags flags = static_cast<Flags>(pickle_flags & ~kIPCSerializationSourceFlag); | 300 Flags flags = static_cast<Flags>(pickle_flags & ~kIPCSerializationSourceFlag); |
| 284 | 301 |
| 285 DCHECK_NE(NOT_VALID_IN_RENDERER, histogram_type); | 302 DCHECK_NE(NOT_VALID_IN_RENDERER, histogram_type); |
| 286 | 303 |
| 287 Histogram* render_histogram(NULL); | 304 Histogram* render_histogram(NULL); |
| 288 | 305 |
| 289 if (histogram_type == HISTOGRAM) { | 306 if (histogram_type == HISTOGRAM) { |
| 290 render_histogram = Histogram::FactoryGet( | 307 render_histogram = Histogram::FactoryGet( |
| 291 histogram_name, declared_min, declared_max, bucket_count, flags); | 308 histogram_name, declared_min, declared_max, bucket_count, flags); |
| 292 } else if (histogram_type == LINEAR_HISTOGRAM) { | 309 } else if (histogram_type == LINEAR_HISTOGRAM) { |
| 293 render_histogram = LinearHistogram::FactoryGet( | 310 render_histogram = LinearHistogram::FactoryGet( |
| 294 histogram_name, declared_min, declared_max, bucket_count, flags); | 311 histogram_name, declared_min, declared_max, bucket_count, flags); |
| 295 } else if (histogram_type == BOOLEAN_HISTOGRAM) { | 312 } else if (histogram_type == BOOLEAN_HISTOGRAM) { |
| 296 render_histogram = BooleanHistogram::FactoryGet(histogram_name, flags); | 313 render_histogram = BooleanHistogram::FactoryGet(histogram_name, flags); |
| 314 } else if (histogram_type == CUSTOM_HISTOGRAM) { | |
| 315 render_histogram = | |
| 316 CustomHistogram::FactoryGet(histogram_name, sample_ranges, flags); | |
| 297 } else { | 317 } else { |
| 298 DLOG(ERROR) << "Error Deserializing Histogram Unknown histogram_type: " | 318 DLOG(ERROR) << "Error Deserializing Histogram Unknown histogram_type: " |
| 299 << histogram_type; | 319 << histogram_type; |
| 300 return false; | 320 return false; |
| 301 } | 321 } |
| 302 | 322 |
| 303 DCHECK_EQ(render_histogram->declared_min(), declared_min); | 323 DCHECK_EQ(render_histogram->declared_min(), declared_min); |
| 304 DCHECK_EQ(render_histogram->declared_max(), declared_max); | 324 DCHECK_EQ(render_histogram->declared_max(), declared_max); |
| 305 DCHECK_EQ(render_histogram->bucket_count(), bucket_count); | 325 DCHECK_EQ(render_histogram->bucket_count(), bucket_count); |
| 306 DCHECK_EQ(render_histogram->range_checksum(), range_checksum); | 326 DCHECK_EQ(render_histogram->range_checksum(), range_checksum); |
| (...skipping 966 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1273 return false; | 1293 return false; |
| 1274 if (ranges_.size() != other->ranges_.size()) | 1294 if (ranges_.size() != other->ranges_.size()) |
| 1275 return false; | 1295 return false; |
| 1276 for (size_t index = 0; index < ranges_.size(); ++index) { | 1296 for (size_t index = 0; index < ranges_.size(); ++index) { |
| 1277 if (ranges_[index] != other->ranges_[index]) | 1297 if (ranges_[index] != other->ranges_[index]) |
| 1278 return false; | 1298 return false; |
| 1279 } | 1299 } |
| 1280 return true; | 1300 return true; |
| 1281 } | 1301 } |
| 1282 | 1302 |
| 1303 | |
|
jar (doing other things)
2011/11/11 19:43:38
nit: remove extra blank line
Ami GONE FROM CHROMIUM
2011/11/11 22:44:48
Done.
| |
| 1304 bool CachedRanges::Serialize(Pickle* pickle) const { | |
|
jar (doing other things)
2011/11/11 19:43:38
I *think* that if you want to put this method in a
Ami GONE FROM CHROMIUM
2011/11/11 22:44:48
I agree with your basic concern, which is that the
| |
| 1305 for (size_t i = 0; i < ranges_.size(); ++i) { | |
| 1306 if (!pickle->WriteInt(ranges_[i])) | |
| 1307 return false; | |
| 1308 } | |
| 1309 return true; | |
| 1310 } | |
| 1311 | |
| 1312 bool CachedRanges::Deserialize(void** iter, const Pickle& pickle) { | |
|
jar (doing other things)
2011/11/11 19:43:38
I'm not convinced that this method should be in th
Ami GONE FROM CHROMIUM
2011/11/11 22:44:48
See above.
| |
| 1313 for (size_t i = 0; i < ranges_.size(); ++i) { | |
| 1314 if (!pickle.ReadInt(iter, &ranges_[i])) | |
| 1315 return false; | |
| 1316 } | |
| 1317 return true; | |
| 1318 } | |
| 1319 | |
| 1283 // static | 1320 // static |
| 1284 StatisticsRecorder::HistogramMap* StatisticsRecorder::histograms_ = NULL; | 1321 StatisticsRecorder::HistogramMap* StatisticsRecorder::histograms_ = NULL; |
| 1285 // static | 1322 // static |
| 1286 StatisticsRecorder::RangesMap* StatisticsRecorder::ranges_ = NULL; | 1323 StatisticsRecorder::RangesMap* StatisticsRecorder::ranges_ = NULL; |
| 1287 // static | 1324 // static |
| 1288 base::Lock* StatisticsRecorder::lock_ = NULL; | 1325 base::Lock* StatisticsRecorder::lock_ = NULL; |
| 1289 // static | 1326 // static |
| 1290 bool StatisticsRecorder::dump_on_exit_ = false; | 1327 bool StatisticsRecorder::dump_on_exit_ = false; |
| 1291 } // namespace base | 1328 } // namespace base |
| OLD | NEW |