| // 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 |