Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2015 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2015 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/histogram_persistence.h" | 5 #include "base/metrics/histogram_persistence.h" |
| 6 | 6 |
| 7 #include "base/lazy_instance.h" | 7 #include "base/lazy_instance.h" |
| 8 #include "base/logging.h" | 8 #include "base/logging.h" |
| 9 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
| 10 #include "base/metrics/histogram.h" | 10 #include "base/metrics/histogram.h" |
| (...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 215 NOTREACHED(); | 215 NOTREACHED(); |
| 216 return nullptr; | 216 return nullptr; |
| 217 } | 217 } |
| 218 ranges = StatisticsRecorder::RegisterOrDeleteDuplicateRanges(ranges); | 218 ranges = StatisticsRecorder::RegisterOrDeleteDuplicateRanges(ranges); |
| 219 | 219 |
| 220 HistogramBase::AtomicCount* counts_data = | 220 HistogramBase::AtomicCount* counts_data = |
| 221 allocator->GetAsObject<HistogramBase::AtomicCount>( | 221 allocator->GetAsObject<HistogramBase::AtomicCount>( |
| 222 histogram_data.counts_ref, kTypeIdCountsArray); | 222 histogram_data.counts_ref, kTypeIdCountsArray); |
| 223 if (!counts_data || | 223 if (!counts_data || |
| 224 allocator->GetAllocSize(histogram_data.counts_ref) < | 224 allocator->GetAllocSize(histogram_data.counts_ref) < |
| 225 histogram_data.bucket_count * sizeof(HistogramBase::AtomicCount)) { | 225 2 * histogram_data.bucket_count * |
| 226 sizeof(HistogramBase::AtomicCount)) { | |
|
Alexei Svitkine (slow)
2016/02/09 19:46:51
Nit: Can you make a variable to store the size and
bcwhite
2016/02/11 16:42:38
Done.
| |
| 226 RecordCreateHistogramResult(CREATE_HISTOGRAM_INVALID_COUNTS_ARRAY); | 227 RecordCreateHistogramResult(CREATE_HISTOGRAM_INVALID_COUNTS_ARRAY); |
| 227 NOTREACHED(); | 228 NOTREACHED(); |
| 228 return nullptr; | 229 return nullptr; |
| 229 } | 230 } |
| 231 HistogramBase::AtomicCount* logged_data = | |
|
Alexei Svitkine (slow)
2016/02/09 19:46:51
Add a comment mentioning the second half of the co
bcwhite
2016/02/11 16:42:38
Done.
| |
| 232 counts_data + histogram_data.bucket_count; | |
| 230 | 233 |
| 231 std::string name(histogram_data_ptr->name); | 234 std::string name(histogram_data_ptr->name); |
| 232 HistogramBase* histogram = nullptr; | 235 HistogramBase* histogram = nullptr; |
| 233 switch (histogram_data.histogram_type) { | 236 switch (histogram_data.histogram_type) { |
| 234 case HISTOGRAM: | 237 case HISTOGRAM: |
| 235 histogram = Histogram::PersistentGet( | 238 histogram = Histogram::PersistentGet( |
| 236 name, | 239 name, |
| 237 histogram_data.minimum, | 240 histogram_data.minimum, |
| 238 histogram_data.maximum, | 241 histogram_data.maximum, |
| 239 ranges, | 242 ranges, |
| 240 counts_data, | 243 counts_data, |
| 244 logged_data, | |
| 241 histogram_data.bucket_count, | 245 histogram_data.bucket_count, |
| 242 &histogram_data_ptr->samples_metadata); | 246 &histogram_data_ptr->samples_metadata); |
| 243 DCHECK(histogram); | 247 DCHECK(histogram); |
| 244 break; | 248 break; |
| 245 case LINEAR_HISTOGRAM: | 249 case LINEAR_HISTOGRAM: |
| 246 histogram = LinearHistogram::PersistentGet( | 250 histogram = LinearHistogram::PersistentGet( |
| 247 name, | 251 name, |
| 248 histogram_data.minimum, | 252 histogram_data.minimum, |
| 249 histogram_data.maximum, | 253 histogram_data.maximum, |
| 250 ranges, | 254 ranges, |
| 251 counts_data, | 255 counts_data, |
| 256 logged_data, | |
| 252 histogram_data.bucket_count, | 257 histogram_data.bucket_count, |
| 253 &histogram_data_ptr->samples_metadata); | 258 &histogram_data_ptr->samples_metadata); |
| 254 DCHECK(histogram); | 259 DCHECK(histogram); |
| 255 break; | 260 break; |
| 256 case BOOLEAN_HISTOGRAM: | 261 case BOOLEAN_HISTOGRAM: |
| 257 histogram = BooleanHistogram::PersistentGet( | 262 histogram = BooleanHistogram::PersistentGet( |
| 258 name, | 263 name, |
| 259 ranges, | 264 ranges, |
| 260 counts_data, | 265 counts_data, |
| 266 logged_data, | |
| 261 &histogram_data_ptr->samples_metadata); | 267 &histogram_data_ptr->samples_metadata); |
| 262 DCHECK(histogram); | 268 DCHECK(histogram); |
| 263 break; | 269 break; |
| 264 case CUSTOM_HISTOGRAM: | 270 case CUSTOM_HISTOGRAM: |
| 265 histogram = CustomHistogram::PersistentGet( | 271 histogram = CustomHistogram::PersistentGet( |
| 266 name, | 272 name, |
| 267 ranges, | 273 ranges, |
| 268 counts_data, | 274 counts_data, |
| 275 logged_data, | |
| 269 histogram_data.bucket_count, | 276 histogram_data.bucket_count, |
| 270 &histogram_data_ptr->samples_metadata); | 277 &histogram_data_ptr->samples_metadata); |
| 271 DCHECK(histogram); | 278 DCHECK(histogram); |
| 272 break; | 279 break; |
| 273 default: | 280 default: |
| 274 NOTREACHED(); | 281 NOTREACHED(); |
| 275 } | 282 } |
| 276 | 283 |
| 277 if (histogram) { | 284 if (histogram) { |
| 278 DCHECK_EQ(histogram_data.histogram_type, histogram->GetHistogramType()); | 285 DCHECK_EQ(histogram_data.histogram_type, histogram->GetHistogramType()); |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 344 | 351 |
| 345 size_t bucket_count = bucket_ranges->bucket_count(); | 352 size_t bucket_count = bucket_ranges->bucket_count(); |
| 346 // An overflow such as this, perhaps as the result of a milicious actor, | 353 // An overflow such as this, perhaps as the result of a milicious actor, |
| 347 // could lead to writing beyond the allocation boundary and into other | 354 // could lead to writing beyond the allocation boundary and into other |
| 348 // memory. Just fail the allocation and let the caller deal with it. | 355 // memory. Just fail the allocation and let the caller deal with it. |
| 349 if (bucket_count > std::numeric_limits<int32_t>::max() / | 356 if (bucket_count > std::numeric_limits<int32_t>::max() / |
| 350 sizeof(HistogramBase::AtomicCount)) { | 357 sizeof(HistogramBase::AtomicCount)) { |
| 351 NOTREACHED(); | 358 NOTREACHED(); |
| 352 return nullptr; | 359 return nullptr; |
| 353 } | 360 } |
| 354 size_t counts_bytes = bucket_count * sizeof(HistogramBase::AtomicCount); | 361 |
| 362 // Allocate persistent memory for 2x bucket counts (one for "live" and one | |
| 363 // for "logged") and memory for bucket ranges. | |
| 364 size_t counts_bytes = 2 * bucket_count * sizeof(HistogramBase::AtomicCount); | |
| 355 size_t ranges_bytes = (bucket_count + 1) * sizeof(HistogramBase::Sample); | 365 size_t ranges_bytes = (bucket_count + 1) * sizeof(HistogramBase::Sample); |
| 356 PersistentMemoryAllocator::Reference ranges_ref = | 366 PersistentMemoryAllocator::Reference ranges_ref = |
| 357 allocator->Allocate(ranges_bytes, kTypeIdRangesArray); | 367 allocator->Allocate(ranges_bytes, kTypeIdRangesArray); |
| 358 PersistentMemoryAllocator::Reference counts_ref = | 368 PersistentMemoryAllocator::Reference counts_ref = |
| 359 allocator->Allocate(counts_bytes, kTypeIdCountsArray); | 369 allocator->Allocate(counts_bytes, kTypeIdCountsArray); |
| 360 PersistentMemoryAllocator::Reference histogram_ref = | 370 PersistentMemoryAllocator::Reference histogram_ref = |
| 361 allocator->Allocate(offsetof(PersistentHistogramData, name) + | 371 allocator->Allocate(offsetof(PersistentHistogramData, name) + |
| 362 name.length() + 1, kTypeIdHistogram); | 372 name.length() + 1, kTypeIdHistogram); |
| 363 HistogramBase::Sample* ranges_data = | 373 HistogramBase::Sample* ranges_data = |
| 364 allocator->GetAsObject<HistogramBase::Sample>(ranges_ref, | 374 allocator->GetAsObject<HistogramBase::Sample>(ranges_ref, |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 430 for (;;) { | 440 for (;;) { |
| 431 HistogramBase* histogram = GetNextPersistentHistogram(g_allocator, &iter); | 441 HistogramBase* histogram = GetNextPersistentHistogram(g_allocator, &iter); |
| 432 if (!histogram) | 442 if (!histogram) |
| 433 break; | 443 break; |
| 434 StatisticsRecorder::RegisterOrDeleteDuplicate(histogram); | 444 StatisticsRecorder::RegisterOrDeleteDuplicate(histogram); |
| 435 } | 445 } |
| 436 } | 446 } |
| 437 } | 447 } |
| 438 | 448 |
| 439 } // namespace base | 449 } // namespace base |
| OLD | NEW |