Add implementation in metrics.h that uses atomic pointer.

Update test implementation (test/histograms.h) to be more similar a real implementation (where histogram get functions return a Histogram pointer). Add check that the name of a histogram does not change.

BUG=webrtc:5283

Review URL: https://codereview.webrtc.org/1528403003

Cr-Commit-Position: refs/heads/master@{#11161}
diff --git a/webrtc/test/histogram.cc b/webrtc/test/histogram.cc
index 6fcdb68..2893e43 100644
--- a/webrtc/test/histogram.cc
+++ b/webrtc/test/histogram.cc
@@ -12,6 +12,7 @@
 
 #include <map>
 
+#include "webrtc/base/checks.h"
 #include "webrtc/base/criticalsection.h"
 #include "webrtc/base/thread_annotations.h"
 #include "webrtc/system_wrappers/include/metrics.h"
@@ -22,10 +23,10 @@
 namespace webrtc {
 namespace {
 struct SampleInfo {
-  SampleInfo(int sample)
-      : last(sample), total(1) {}
-  int last;   // Last added sample.
-  int total;  // Total number of added samples.
+  SampleInfo(const std::string& name) : name_(name), last_(-1), total_(0) {}
+  const std::string name_;
+  int last_;   // Last added sample.
+  int total_;  // Total number of added samples.
 };
 
 rtc::CriticalSection histogram_crit_;
@@ -36,21 +37,33 @@
 
 namespace metrics {
 Histogram* HistogramFactoryGetCounts(const std::string& name, int min, int max,
-    int bucket_count) { return NULL; }
+                                     int bucket_count) {
+  rtc::CritScope cs(&histogram_crit_);
+  if (histograms_.find(name) == histograms_.end()) {
+    histograms_.insert(std::make_pair(name, SampleInfo(name)));
+  }
+  auto it = histograms_.find(name);
+  return reinterpret_cast<Histogram*>(&it->second);
+}
 
 Histogram* HistogramFactoryGetEnumeration(const std::string& name,
-    int boundary) { return NULL; }
+                                          int boundary) {
+  rtc::CritScope cs(&histogram_crit_);
+  if (histograms_.find(name) == histograms_.end()) {
+    histograms_.insert(std::make_pair(name, SampleInfo(name)));
+  }
+  auto it = histograms_.find(name);
+  return reinterpret_cast<Histogram*>(&it->second);
+}
 
 void HistogramAdd(
     Histogram* histogram_pointer, const std::string& name, int sample) {
   rtc::CritScope cs(&histogram_crit_);
-  auto it = histograms_.find(name);
-  if (it == histograms_.end()) {
-    histograms_.insert(std::make_pair(name, SampleInfo(sample)));
-    return;
-  }
-  it->second.last = sample;
-  ++it->second.total;
+  SampleInfo* ptr = reinterpret_cast<SampleInfo*>(histogram_pointer);
+  // The name should not vary.
+  RTC_CHECK(ptr->name_ == name);
+  ptr->last_ = sample;
+  ++ptr->total_;
 }
 }  // namespace metrics
 
@@ -61,7 +74,7 @@
   if (it == histograms_.end()) {
     return -1;
   }
-  return it->second.last;
+  return it->second.last_;
 }
 
 int NumHistogramSamples(const std::string& name) {
@@ -70,13 +83,15 @@
   if (it == histograms_.end()) {
     return 0;
   }
-  return it->second.total;
+  return it->second.total_;
 }
 
 void ClearHistograms() {
   rtc::CritScope cs(&histogram_crit_);
-  histograms_.clear();
+  for (auto& it : histograms_) {
+    it.second.last_ = -1;
+    it.second.total_ = 0;
+  }
 }
 }  // namespace test
 }  // namespace webrtc
-