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/logging.h" | 7 #include "base/logging.h" |
8 #include "base/metrics/bucket_ranges.h" | 8 #include "base/metrics/bucket_ranges.h" |
9 | 9 |
10 using std::vector; | 10 using std::vector; |
(...skipping 14 matching lines...) Expand all Loading... |
25 void SampleVector::Accumulate(Sample value, Count count) { | 25 void SampleVector::Accumulate(Sample value, Count count) { |
26 size_t bucket_index = GetBucketIndex(value); | 26 size_t bucket_index = GetBucketIndex(value); |
27 subtle::NoBarrier_Store(&counts_[bucket_index], | 27 subtle::NoBarrier_Store(&counts_[bucket_index], |
28 subtle::NoBarrier_Load(&counts_[bucket_index]) + count); | 28 subtle::NoBarrier_Load(&counts_[bucket_index]) + count); |
29 IncreaseSum(count * value); | 29 IncreaseSum(count * value); |
30 IncreaseRedundantCount(count); | 30 IncreaseRedundantCount(count); |
31 } | 31 } |
32 | 32 |
33 Count SampleVector::GetCount(Sample value) const { | 33 Count SampleVector::GetCount(Sample value) const { |
34 size_t bucket_index = GetBucketIndex(value); | 34 size_t bucket_index = GetBucketIndex(value); |
35 return counts_[bucket_index]; | 35 return subtle::NoBarrier_Load(&counts_[bucket_index]); |
36 } | 36 } |
37 | 37 |
38 Count SampleVector::TotalCount() const { | 38 Count SampleVector::TotalCount() const { |
39 Count count = 0; | 39 Count count = 0; |
40 for (size_t i = 0; i < counts_.size(); i++) { | 40 for (size_t i = 0; i < counts_.size(); i++) { |
41 count += counts_[i]; | 41 count += subtle::NoBarrier_Load(&counts_[i]); |
42 } | 42 } |
43 return count; | 43 return count; |
44 } | 44 } |
45 | 45 |
46 Count SampleVector::GetCountAtIndex(size_t bucket_index) const { | 46 Count SampleVector::GetCountAtIndex(size_t bucket_index) const { |
47 DCHECK(bucket_index < counts_.size()); | 47 DCHECK(bucket_index < counts_.size()); |
48 return counts_[bucket_index]; | 48 return subtle::NoBarrier_Load(&counts_[bucket_index]); |
49 } | 49 } |
50 | 50 |
51 scoped_ptr<SampleCountIterator> SampleVector::Iterator() const { | 51 scoped_ptr<SampleCountIterator> SampleVector::Iterator() const { |
52 return scoped_ptr<SampleCountIterator>( | 52 return scoped_ptr<SampleCountIterator>( |
53 new SampleVectorIterator(&counts_, bucket_ranges_)); | 53 new SampleVectorIterator(&counts_, bucket_ranges_)); |
54 } | 54 } |
55 | 55 |
56 bool SampleVector::AddSubtractImpl(SampleCountIterator* iter, | 56 bool SampleVector::AddSubtractImpl(SampleCountIterator* iter, |
57 HistogramSamples::Operator op) { | 57 HistogramSamples::Operator op) { |
58 HistogramBase::Sample min; | 58 HistogramBase::Sample min; |
59 HistogramBase::Sample max; | 59 HistogramBase::Sample max; |
60 HistogramBase::Count count; | 60 HistogramBase::Count count; |
61 | 61 |
62 // Go through the iterator and add the counts into correct bucket. | 62 // Go through the iterator and add the counts into correct bucket. |
63 size_t index = 0; | 63 size_t index = 0; |
64 while (index < counts_.size() && !iter->Done()) { | 64 while (index < counts_.size() && !iter->Done()) { |
65 iter->Get(&min, &max, &count); | 65 iter->Get(&min, &max, &count); |
66 if (min == bucket_ranges_->range(index) && | 66 if (min == bucket_ranges_->range(index) && |
67 max == bucket_ranges_->range(index + 1)) { | 67 max == bucket_ranges_->range(index + 1)) { |
68 // Sample matches this bucket! | 68 // Sample matches this bucket! |
69 counts_[index] += (op == HistogramSamples::ADD) ? count : -count; | 69 HistogramBase::Count old_counts = |
| 70 subtle::NoBarrier_Load(&counts_[index]); |
| 71 subtle::NoBarrier_Store(&counts_[index], |
| 72 old_counts + ((op == HistogramSamples::ADD) ? count : -count)); |
70 iter->Next(); | 73 iter->Next(); |
71 } else if (min > bucket_ranges_->range(index)) { | 74 } else if (min > bucket_ranges_->range(index)) { |
72 // Sample is larger than current bucket range. Try next. | 75 // Sample is larger than current bucket range. Try next. |
73 index++; | 76 index++; |
74 } else { | 77 } else { |
75 // Sample is smaller than current bucket range. We scan buckets from | 78 // Sample is smaller than current bucket range. We scan buckets from |
76 // smallest to largest, so the sample value must be invalid. | 79 // smallest to largest, so the sample value must be invalid. |
77 return false; | 80 return false; |
78 } | 81 } |
79 } | 82 } |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
131 | 134 |
132 void SampleVectorIterator::Get(HistogramBase::Sample* min, | 135 void SampleVectorIterator::Get(HistogramBase::Sample* min, |
133 HistogramBase::Sample* max, | 136 HistogramBase::Sample* max, |
134 HistogramBase::Count* count) const { | 137 HistogramBase::Count* count) const { |
135 DCHECK(!Done()); | 138 DCHECK(!Done()); |
136 if (min != NULL) | 139 if (min != NULL) |
137 *min = bucket_ranges_->range(index_); | 140 *min = bucket_ranges_->range(index_); |
138 if (max != NULL) | 141 if (max != NULL) |
139 *max = bucket_ranges_->range(index_ + 1); | 142 *max = bucket_ranges_->range(index_ + 1); |
140 if (count != NULL) | 143 if (count != NULL) |
141 *count = (*counts_)[index_]; | 144 *count = subtle::NoBarrier_Load(&(*counts_)[index_]); |
142 } | 145 } |
143 | 146 |
144 bool SampleVectorIterator::GetBucketIndex(size_t* index) const { | 147 bool SampleVectorIterator::GetBucketIndex(size_t* index) const { |
145 DCHECK(!Done()); | 148 DCHECK(!Done()); |
146 if (index != NULL) | 149 if (index != NULL) |
147 *index = index_; | 150 *index = index_; |
148 return true; | 151 return true; |
149 } | 152 } |
150 | 153 |
151 void SampleVectorIterator::SkipEmptyBuckets() { | 154 void SampleVectorIterator::SkipEmptyBuckets() { |
152 if (Done()) | 155 if (Done()) |
153 return; | 156 return; |
154 | 157 |
155 while (index_ < counts_->size()) { | 158 while (index_ < counts_->size()) { |
156 if ((*counts_)[index_] != 0) | 159 if (subtle::NoBarrier_Load(&(*counts_)[index_]) != 0) |
157 return; | 160 return; |
158 index_++; | 161 index_++; |
159 } | 162 } |
160 } | 163 } |
161 | 164 |
162 } // namespace base | 165 } // namespace base |
OLD | NEW |