| Index: chrome/browser/metrics/metrics_service.cc
|
| diff --git a/chrome/browser/metrics/metrics_service.cc b/chrome/browser/metrics/metrics_service.cc
|
| index 93dffd8b251634fce6ff91e4b997c43520c86564..b9f99987d8d547da744beafafdb99c061e4286d7 100644
|
| --- a/chrome/browser/metrics/metrics_service.cc
|
| +++ b/chrome/browser/metrics/metrics_service.cc
|
| @@ -264,16 +264,17 @@ struct MetricsService::ChildProcessStats {
|
| // Will run the provided task after finished.
|
| class MetricsMemoryDetails : public MemoryDetails {
|
| public:
|
| - explicit MetricsMemoryDetails(Task* completion) : completion_(completion) {}
|
| + explicit MetricsMemoryDetails(const base::Closure& callback)
|
| + : callback_(callback) {}
|
|
|
| virtual void OnDetailsAvailable() {
|
| - MessageLoop::current()->PostTask(FROM_HERE, completion_);
|
| + MessageLoop::current()->PostTask(FROM_HERE, callback_);
|
| }
|
|
|
| private:
|
| ~MetricsMemoryDetails() {}
|
|
|
| - Task* completion_;
|
| + base::Closure callback_;
|
| DISALLOW_COPY_AND_ASSIGN(MetricsMemoryDetails);
|
| };
|
|
|
| @@ -365,8 +366,8 @@ MetricsService::MetricsService()
|
| io_thread_(NULL),
|
| idle_since_last_transmission_(false),
|
| next_window_id_(0),
|
| - ALLOW_THIS_IN_INITIALIZER_LIST(log_sender_factory_(this)),
|
| - ALLOW_THIS_IN_INITIALIZER_LIST(state_saver_factory_(this)),
|
| + ALLOW_THIS_IN_INITIALIZER_LIST(log_sender_weak_factory_(this)),
|
| + ALLOW_THIS_IN_INITIALIZER_LIST(state_saver_weak_factory_(this)),
|
| waiting_for_asynchronus_reporting_step_(false) {
|
| DCHECK(IsSingleThreaded());
|
| InitializeMetricsState();
|
| @@ -760,10 +761,12 @@ std::string MetricsService::GenerateClientID() {
|
| // State save methods
|
|
|
| void MetricsService::ScheduleNextStateSave() {
|
| - state_saver_factory_.RevokeAll();
|
| + state_saver_weak_factory_.InvalidateWeakPtrs();
|
|
|
| - MessageLoop::current()->PostDelayedTask(FROM_HERE,
|
| - state_saver_factory_.NewRunnableMethod(&MetricsService::SaveLocalState),
|
| + MessageLoop::current()->PostDelayedTask(
|
| + FROM_HERE,
|
| + base::Bind(&MetricsService::SaveLocalState,
|
| + state_saver_weak_factory_.GetWeakPtr()),
|
| kSaveStateInterval * 1000);
|
| }
|
|
|
| @@ -874,10 +877,12 @@ void MetricsService::StartScheduledUpload() {
|
| DCHECK(!waiting_for_asynchronus_reporting_step_);
|
| waiting_for_asynchronus_reporting_step_ = true;
|
|
|
| - Task* task = log_sender_factory_.
|
| - NewRunnableMethod(&MetricsService::OnMemoryDetailCollectionDone);
|
| + base::Closure callback =
|
| + base::Bind(&MetricsService::OnMemoryDetailCollectionDone,
|
| + log_sender_weak_factory_.GetWeakPtr());
|
|
|
| - scoped_refptr<MetricsMemoryDetails> details(new MetricsMemoryDetails(task));
|
| + scoped_refptr<MetricsMemoryDetails> details(
|
| + new MetricsMemoryDetails(callback));
|
| details->StartFetch();
|
|
|
| // Collect WebCore cache information to put into a histogram.
|
| @@ -901,8 +906,9 @@ void MetricsService::OnMemoryDetailCollectionDone() {
|
| // OnHistogramSynchronizationDone to continue processing.
|
|
|
| // Create a callback_task for OnHistogramSynchronizationDone.
|
| - Task* callback_task = log_sender_factory_.NewRunnableMethod(
|
| - &MetricsService::OnHistogramSynchronizationDone);
|
| + base::Closure callback = base::Bind(
|
| + &MetricsService::OnHistogramSynchronizationDone,
|
| + log_sender_weak_factory_.GetWeakPtr());
|
|
|
| base::StatisticsRecorder::CollectHistogramStats("Browser");
|
|
|
| @@ -910,7 +916,7 @@ void MetricsService::OnMemoryDetailCollectionDone() {
|
| // renderer processes. Wait time specifies how long to wait before absolutely
|
| // calling us back on the task.
|
| HistogramSynchronizer::FetchRendererHistogramsAsynchronously(
|
| - MessageLoop::current(), callback_task,
|
| + MessageLoop::current(), callback,
|
| kMaxHistogramGatheringWaitDuration);
|
| }
|
|
|
|
|