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); |
} |