| Index: base/metrics/statistics_recorder.cc
|
| diff --git a/base/metrics/statistics_recorder.cc b/base/metrics/statistics_recorder.cc
|
| index b19a897a96c1ab6e2d7737bd2648100c9bd10281..43e3070077821b412e0fac91e4961b98bdfcc44b 100644
|
| --- a/base/metrics/statistics_recorder.cc
|
| +++ b/base/metrics/statistics_recorder.cc
|
| @@ -74,8 +74,12 @@ StatisticsRecorder::~StatisticsRecorder() {
|
| DCHECK(histograms_);
|
| DCHECK(ranges_);
|
|
|
| - // Global clean up.
|
| + // Clean out what this object created and then restore what existed before.
|
| Reset();
|
| + base::AutoLock auto_lock(*lock_);
|
| + histograms_ = existing_histograms_.release();
|
| + callbacks_ = existing_callbacks_.release();
|
| + ranges_ = existing_ranges_.release();
|
| }
|
|
|
| // static
|
| @@ -393,22 +397,32 @@ size_t StatisticsRecorder::GetHistogramCount() {
|
| }
|
|
|
| // static
|
| -void StatisticsRecorder::ResetForTesting() {
|
| - // Just call the private version that is used also by the destructor.
|
| - Reset();
|
| -}
|
| -
|
| -// static
|
| void StatisticsRecorder::ForgetHistogramForTesting(base::StringPiece name) {
|
| if (histograms_)
|
| histograms_->erase(name);
|
| }
|
|
|
| +// static
|
| +void StatisticsRecorder::UninitializeForTesting() {
|
| + // Stop now if it's never been initialized.
|
| + if (lock_ == NULL || histograms_ == NULL)
|
| + return;
|
| +
|
| + // Get the global instance and destruct it. It's held in static memory so
|
| + // can't "delete" it; call the destructor explicitly.
|
| + DCHECK(g_statistics_recorder_.private_instance_);
|
| + g_statistics_recorder_.Get().~StatisticsRecorder();
|
| +
|
| + // Now the ugly part. There's no official way to release a LazyInstance once
|
| + // created so it's necessary to clear out an internal variable which
|
| + // shouldn't be publicly visible but is for initialization reasons.
|
| + g_statistics_recorder_.private_instance_ = 0;
|
| +}
|
| +
|
| // This singleton instance should be started during the single threaded portion
|
| // of main(), and hence it is not thread safe. It initializes globals to
|
| // provide support for all future calls.
|
| StatisticsRecorder::StatisticsRecorder() {
|
| - DCHECK(!histograms_);
|
| if (lock_ == NULL) {
|
| // This will leak on purpose. It's the only way to make sure we won't race
|
| // against the static uninitialization of the module while one of our
|
| @@ -418,7 +432,13 @@ StatisticsRecorder::StatisticsRecorder() {
|
| // during static initialization and released only on process termination.
|
| lock_ = new base::Lock;
|
| }
|
| +
|
| base::AutoLock auto_lock(*lock_);
|
| +
|
| + existing_histograms_.reset(histograms_);
|
| + existing_callbacks_.reset(callbacks_);
|
| + existing_ranges_.reset(ranges_);
|
| +
|
| histograms_ = new HistogramMap;
|
| callbacks_ = new CallbackMap;
|
| ranges_ = new RangesMap;
|
|
|