| Index: base/metrics/histogram_samples.cc
 | 
| diff --git a/base/metrics/histogram_samples.cc b/base/metrics/histogram_samples.cc
 | 
| index f5e03b979e110cbf297e27ab278225965141a1eb..b6303a53b469cbdbb9602fa3009cefc230e121c5 100644
 | 
| --- a/base/metrics/histogram_samples.cc
 | 
| +++ b/base/metrics/histogram_samples.cc
 | 
| @@ -59,30 +59,50 @@ void SampleCountPickleIterator::Get(HistogramBase::Sample* min,
 | 
|  
 | 
|  }  // namespace
 | 
|  
 | 
| -HistogramSamples::HistogramSamples() : sum_(0), redundant_count_(0) {}
 | 
| +HistogramSamples::HistogramSamples(uint64_t id)
 | 
| +    : HistogramSamples(id, &local_meta_) {}
 | 
| +
 | 
| +HistogramSamples::HistogramSamples(uint64_t id, Metadata* meta)
 | 
| +    : meta_(meta) {
 | 
| +  DCHECK(meta_->id == 0 || meta_->id == id);
 | 
| +  meta_->id = id;
 | 
| +}
 | 
|  
 | 
|  HistogramSamples::~HistogramSamples() {}
 | 
|  
 | 
| +// Despite using atomic operations, the increment/add actions below are *not*
 | 
| +// atomic! Race conditions may cause loss of samples or even completely corrupt
 | 
| +// the 64-bit sum on 32-bit machines. This is done intentionally to reduce the
 | 
| +// cost of these operations that could be executed in performance-significant
 | 
| +//  points of the code.
 | 
| +//
 | 
| +// TODO(bcwhite): Gather quantitative information as to the cost of using
 | 
| +// proper atomic increments and improve either globally or for those histograms
 | 
| +// that really need it.
 | 
| +
 | 
|  void HistogramSamples::Add(const HistogramSamples& other) {
 | 
| -  sum_ += other.sum();
 | 
| +  meta_->sum += other.sum();
 | 
| +
 | 
|    HistogramBase::Count old_redundant_count =
 | 
| -      subtle::NoBarrier_Load(&redundant_count_);
 | 
| -  subtle::NoBarrier_Store(&redundant_count_,
 | 
| +      subtle::NoBarrier_Load(&meta_->redundant_count);
 | 
| +  subtle::NoBarrier_Store(&meta_->redundant_count,
 | 
|        old_redundant_count + other.redundant_count());
 | 
|    bool success = AddSubtractImpl(other.Iterator().get(), ADD);
 | 
|    DCHECK(success);
 | 
|  }
 | 
|  
 | 
|  bool HistogramSamples::AddFromPickle(PickleIterator* iter) {
 | 
| -  int64 sum;
 | 
| +  int64_t sum;
 | 
|    HistogramBase::Count redundant_count;
 | 
|  
 | 
|    if (!iter->ReadInt64(&sum) || !iter->ReadInt(&redundant_count))
 | 
|      return false;
 | 
| -  sum_ += sum;
 | 
| +
 | 
| +  meta_->sum += sum;
 | 
| +
 | 
|    HistogramBase::Count old_redundant_count =
 | 
| -      subtle::NoBarrier_Load(&redundant_count_);
 | 
| -  subtle::NoBarrier_Store(&redundant_count_,
 | 
| +      subtle::NoBarrier_Load(&meta_->redundant_count);
 | 
| +  subtle::NoBarrier_Store(&meta_->redundant_count,
 | 
|                            old_redundant_count + redundant_count);
 | 
|  
 | 
|    SampleCountPickleIterator pickle_iter(iter);
 | 
| @@ -90,18 +110,20 @@ bool HistogramSamples::AddFromPickle(PickleIterator* iter) {
 | 
|  }
 | 
|  
 | 
|  void HistogramSamples::Subtract(const HistogramSamples& other) {
 | 
| -  sum_ -= other.sum();
 | 
| +  meta_->sum -= other.sum();
 | 
| +
 | 
|    HistogramBase::Count old_redundant_count =
 | 
| -      subtle::NoBarrier_Load(&redundant_count_);
 | 
| -  subtle::NoBarrier_Store(&redundant_count_,
 | 
| +      subtle::NoBarrier_Load(&meta_->redundant_count);
 | 
| +  subtle::NoBarrier_Store(&meta_->redundant_count,
 | 
|                            old_redundant_count - other.redundant_count());
 | 
|    bool success = AddSubtractImpl(other.Iterator().get(), SUBTRACT);
 | 
|    DCHECK(success);
 | 
|  }
 | 
|  
 | 
|  bool HistogramSamples::Serialize(Pickle* pickle) const {
 | 
| -  if (!pickle->WriteInt64(sum_) ||
 | 
| -      !pickle->WriteInt(subtle::NoBarrier_Load(&redundant_count_)))
 | 
| +  if (!pickle->WriteInt64(meta_->sum))
 | 
| +    return false;
 | 
| +  if (!pickle->WriteInt(subtle::NoBarrier_Load(&meta_->redundant_count)))
 | 
|      return false;
 | 
|  
 | 
|    HistogramBase::Sample min;
 | 
| @@ -119,13 +141,13 @@ bool HistogramSamples::Serialize(Pickle* pickle) const {
 | 
|    return true;
 | 
|  }
 | 
|  
 | 
| -void HistogramSamples::IncreaseSum(int64 diff) {
 | 
| -  sum_ += diff;
 | 
| +void HistogramSamples::IncreaseSum(int64_t diff) {
 | 
| +  meta_->sum += diff;
 | 
|  }
 | 
|  
 | 
|  void HistogramSamples::IncreaseRedundantCount(HistogramBase::Count diff) {
 | 
| -  subtle::NoBarrier_Store(&redundant_count_,
 | 
| -      subtle::NoBarrier_Load(&redundant_count_) + diff);
 | 
| +  subtle::NoBarrier_Store(&meta_->redundant_count,
 | 
| +      subtle::NoBarrier_Load(&meta_->redundant_count) + diff);
 | 
|  }
 | 
|  
 | 
|  SampleCountIterator::~SampleCountIterator() {}
 | 
| 
 |