OLD | NEW |
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/sample_vector.h" | 5 #include "base/metrics/sample_vector.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/ptr_util.h" | 9 #include "base/memory/ptr_util.h" |
10 #include "base/metrics/persistent_memory_allocator.h" | 10 #include "base/metrics/persistent_memory_allocator.h" |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
125 } | 125 } |
126 | 126 |
127 bool SampleVectorBase::AddSubtractImpl(SampleCountIterator* iter, | 127 bool SampleVectorBase::AddSubtractImpl(SampleCountIterator* iter, |
128 HistogramSamples::Operator op) { | 128 HistogramSamples::Operator op) { |
129 // Stop now if there's nothing to do. | 129 // Stop now if there's nothing to do. |
130 if (iter->Done()) | 130 if (iter->Done()) |
131 return true; | 131 return true; |
132 | 132 |
133 // Get the first value and its index. | 133 // Get the first value and its index. |
134 HistogramBase::Sample min; | 134 HistogramBase::Sample min; |
135 HistogramBase::Sample max; | 135 int64_t max; |
136 HistogramBase::Count count; | 136 HistogramBase::Count count; |
137 iter->Get(&min, &max, &count); | 137 iter->Get(&min, &max, &count); |
138 size_t dest_index = GetBucketIndex(min); | 138 size_t dest_index = GetBucketIndex(min); |
139 | 139 |
140 // The destination must be a superset of the source meaning that though the | 140 // The destination must be a superset of the source meaning that though the |
141 // incoming ranges will find an exact match, the incoming bucket-index, if | 141 // incoming ranges will find an exact match, the incoming bucket-index, if |
142 // it exists, may be offset from the destination bucket-index. Calculate | 142 // it exists, may be offset from the destination bucket-index. Calculate |
143 // that offset of the passed iterator; there are are no overflow checks | 143 // that offset of the passed iterator; there are are no overflow checks |
144 // because 2's compliment math will work it out in the end. | 144 // because 2's compliment math will work it out in the end. |
145 // | 145 // |
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
385 return index_ >= counts_size_; | 385 return index_ >= counts_size_; |
386 } | 386 } |
387 | 387 |
388 void SampleVectorIterator::Next() { | 388 void SampleVectorIterator::Next() { |
389 DCHECK(!Done()); | 389 DCHECK(!Done()); |
390 index_++; | 390 index_++; |
391 SkipEmptyBuckets(); | 391 SkipEmptyBuckets(); |
392 } | 392 } |
393 | 393 |
394 void SampleVectorIterator::Get(HistogramBase::Sample* min, | 394 void SampleVectorIterator::Get(HistogramBase::Sample* min, |
395 HistogramBase::Sample* max, | 395 int64_t* max, |
396 HistogramBase::Count* count) const { | 396 HistogramBase::Count* count) const { |
397 DCHECK(!Done()); | 397 DCHECK(!Done()); |
398 if (min != NULL) | 398 if (min != NULL) |
399 *min = bucket_ranges_->range(index_); | 399 *min = bucket_ranges_->range(index_); |
400 if (max != NULL) | 400 if (max != NULL) |
401 *max = bucket_ranges_->range(index_ + 1); | 401 *max = static_cast<int64_t>(bucket_ranges_->range(index_ + 1)); |
402 if (count != NULL) | 402 if (count != NULL) |
403 *count = subtle::NoBarrier_Load(&counts_[index_]); | 403 *count = subtle::NoBarrier_Load(&counts_[index_]); |
404 } | 404 } |
405 | 405 |
406 bool SampleVectorIterator::GetBucketIndex(size_t* index) const { | 406 bool SampleVectorIterator::GetBucketIndex(size_t* index) const { |
407 DCHECK(!Done()); | 407 DCHECK(!Done()); |
408 if (index != NULL) | 408 if (index != NULL) |
409 *index = index_; | 409 *index = index_; |
410 return true; | 410 return true; |
411 } | 411 } |
412 | 412 |
413 void SampleVectorIterator::SkipEmptyBuckets() { | 413 void SampleVectorIterator::SkipEmptyBuckets() { |
414 if (Done()) | 414 if (Done()) |
415 return; | 415 return; |
416 | 416 |
417 while (index_ < counts_size_) { | 417 while (index_ < counts_size_) { |
418 if (subtle::NoBarrier_Load(&counts_[index_]) != 0) | 418 if (subtle::NoBarrier_Load(&counts_[index_]) != 0) |
419 return; | 419 return; |
420 index_++; | 420 index_++; |
421 } | 421 } |
422 } | 422 } |
423 | 423 |
424 } // namespace base | 424 } // namespace base |
OLD | NEW |