| 145 | } |
| 146 | |
| 147 | void HdrHistogram::IncrementBy(int64_t value, int64_t count) { |
| 148 | DCHECK_GE(value, 0); |
| 149 | DCHECK_GE(count, 0); |
| 150 | |
| 151 | // Dissect the value into bucket and sub-bucket parts, and derive index into |
| 152 | // counts array: |
| 153 | int bucket_index = BucketIndex(value); |
| 154 | int sub_bucket_index = SubBucketIndex(value, bucket_index); |
| 155 | int counts_index = CountsArrayIndex(bucket_index, sub_bucket_index); |
| 156 | |
| 157 | // Increment bucket & total. |
| 158 | NoBarrier_AtomicIncrement(&counts_[counts_index], count); |
| 159 | NoBarrier_AtomicIncrement(&total_count_, count); |
| 160 | NoBarrier_AtomicIncrement(&total_sum_, value * count); |
| 161 | |
| 162 | // Update min, if needed. |
| 163 | { |
| 164 | Atomic64 min_val; |
| 165 | while (PREDICT_FALSE(value < (min_val = MinValue()))) { |
| 166 | Atomic64 old_val = NoBarrier_CompareAndSwap(&min_value_, min_val, value); |
| 167 | if (PREDICT_TRUE(old_val == min_val)) break; // CAS success. |
| 168 | } |
| 169 | } |
| 170 | |
| 171 | // Update max, if needed. |
| 172 | { |
| 173 | Atomic64 max_val; |
| 174 | while (PREDICT_FALSE(value > (max_val = MaxValue()))) { |
| 175 | Atomic64 old_val = NoBarrier_CompareAndSwap(&max_value_, max_val, value); |
| 176 | if (PREDICT_TRUE(old_val == max_val)) break; // CAS success. |
| 177 | } |
| 178 | } |
| 179 | } |
| 180 | |
| 181 | void HdrHistogram::IncrementWithExpectedInterval(int64_t value, |
| 182 | int64_t expected_interval_between_samples) { |