Eliminate race condition in MetricsService and re-enable WizardControllerTest

BUG=110544
TEST=WizardControllerFlowTest.ControlFlowMain, no error during 100 cycles


Review URL: http://codereview.chromium.org/9355058

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@123944 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/chrome/browser/metrics/metrics_service.cc b/chrome/browser/metrics/metrics_service.cc
index 634ef6a..1626a5c 100644
--- a/chrome/browser/metrics/metrics_service.cc
+++ b/chrome/browser/metrics/metrics_service.cc
@@ -369,14 +369,14 @@
       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(self_ptr_factory_(this)),
       ALLOW_THIS_IN_INITIALIZER_LIST(state_saver_factory_(this)),
       waiting_for_asynchronus_reporting_step_(false) {
   DCHECK(IsSingleThreaded());
   InitializeMetricsState();
 
   base::Closure callback = base::Bind(&MetricsService::StartScheduledUpload,
-                                      base::Unretained(this));
+                                      self_ptr_factory_.GetWeakPtr());
   scheduler_.reset(new MetricsReportingScheduler(callback));
   log_manager_.set_log_serializer(new MetricsLogSerializer());
   log_manager_.set_max_ongoing_log_store_size(kUploadLogAvoidRetransmitSize);
@@ -723,9 +723,10 @@
   ScheduleNextStateSave();
 }
 
+// static
 void MetricsService::InitTaskGetHardwareClass(
+    base::WeakPtr<MetricsService> self,
     base::MessageLoopProxy* target_loop) {
-  DCHECK(state_ == INIT_TASK_SCHEDULED);
   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
 
   std::string hardware_class;
@@ -736,23 +737,23 @@
 
   target_loop->PostTask(FROM_HERE,
       base::Bind(&MetricsService::OnInitTaskGotHardwareClass,
-          base::Unretained(this), hardware_class));
+          self, hardware_class));
 }
 
 void MetricsService::OnInitTaskGotHardwareClass(
     const std::string& hardware_class) {
-  DCHECK(state_ == INIT_TASK_SCHEDULED);
+  DCHECK_EQ(state_, INIT_TASK_SCHEDULED);
   hardware_class_ = hardware_class;
 
   // Start the next part of the init task: loading plugin information.
   PluginService::GetInstance()->GetPlugins(
       base::Bind(&MetricsService::OnInitTaskGotPluginInfo,
-          base::Unretained(this)));
+          self_ptr_factory_.GetWeakPtr()));
 }
 
 void MetricsService::OnInitTaskGotPluginInfo(
     const std::vector<webkit::WebPluginInfo>& plugins) {
-  DCHECK(state_ == INIT_TASK_SCHEDULED);
+  DCHECK_EQ(state_, INIT_TASK_SCHEDULED);
   plugins_ = plugins;
 
   io_thread_ = g_browser_process->io_thread();
@@ -810,7 +811,7 @@
         BrowserThread::FILE,
         FROM_HERE,
         base::Bind(&MetricsService::InitTaskGetHardwareClass,
-            base::Unretained(this),
+            self_ptr_factory_.GetWeakPtr(),
             MessageLoop::current()->message_loop_proxy()),
         kInitializationDelaySeconds);
   }
@@ -887,7 +888,7 @@
 
   base::Closure callback =
       base::Bind(&MetricsService::OnMemoryDetailCollectionDone,
-                 log_sender_factory_.GetWeakPtr());
+                 self_ptr_factory_.GetWeakPtr());
 
   scoped_refptr<MetricsMemoryDetails> details(
       new MetricsMemoryDetails(callback));
@@ -916,7 +917,7 @@
   // Create a callback_task for OnHistogramSynchronizationDone.
   base::Closure callback = base::Bind(
       &MetricsService::OnHistogramSynchronizationDone,
-      log_sender_factory_.GetWeakPtr());
+      self_ptr_factory_.GetWeakPtr());
 
   base::StatisticsRecorder::CollectHistogramStats("Browser");