| // Copyright 2014 The Chromium Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #include "base/metrics/user_metrics.h" | 
 |  | 
 | #include <vector> | 
 |  | 
 | #include "base/lazy_instance.h" | 
 | #include "base/threading/thread_checker.h" | 
 |  | 
 | namespace base { | 
 | namespace { | 
 |  | 
 | // A helper class for tracking callbacks and ensuring thread-safety. | 
 | class Callbacks { | 
 |  public: | 
 |   Callbacks() {} | 
 |  | 
 |   // Records the |action|. | 
 |   void Record(const std::string& action) { | 
 |     DCHECK(thread_checker_.CalledOnValidThread()); | 
 |     for (size_t i = 0; i < callbacks_.size(); ++i) { | 
 |       callbacks_[i].Run(action); | 
 |     } | 
 |   } | 
 |  | 
 |   // Adds |callback| to the list of |callbacks_|. | 
 |   void AddCallback(const ActionCallback& callback) { | 
 |     DCHECK(thread_checker_.CalledOnValidThread()); | 
 |     callbacks_.push_back(callback); | 
 |   } | 
 |  | 
 |   // Removes the first instance of |callback| from the list of |callbacks_|, if | 
 |   // there is one. | 
 |   void RemoveCallback(const ActionCallback& callback) { | 
 |     DCHECK(thread_checker_.CalledOnValidThread()); | 
 |     for (size_t i = 0; i < callbacks_.size(); ++i) { | 
 |       if (callbacks_[i].Equals(callback)) { | 
 |         callbacks_.erase(callbacks_.begin() + i); | 
 |         return; | 
 |       } | 
 |     } | 
 |   } | 
 |  | 
 |  private: | 
 |   base::ThreadChecker thread_checker_; | 
 |   std::vector<ActionCallback> callbacks_; | 
 |  | 
 |   DISALLOW_COPY_AND_ASSIGN(Callbacks); | 
 | }; | 
 |  | 
 | base::LazyInstance<Callbacks> g_callbacks = LAZY_INSTANCE_INITIALIZER; | 
 |  | 
 | }  // namespace | 
 |  | 
 | void RecordAction(const UserMetricsAction& action) { | 
 |   g_callbacks.Get().Record(action.str_); | 
 | } | 
 |  | 
 | void RecordComputedAction(const std::string& action) { | 
 |   g_callbacks.Get().Record(action); | 
 | } | 
 |  | 
 | void AddActionCallback(const ActionCallback& callback) { | 
 |   g_callbacks.Get().AddCallback(callback); | 
 | } | 
 |  | 
 | void RemoveActionCallback(const ActionCallback& callback) { | 
 |   g_callbacks.Get().RemoveCallback(callback); | 
 |  | 
 | } | 
 |  | 
 | }  // namespace base |