| Index: chrome/browser/metrics/metrics_service.cc | 
| diff --git a/chrome/browser/metrics/metrics_service.cc b/chrome/browser/metrics/metrics_service.cc | 
| index 25d0af77d158de0edcca51d289e3e5d91efe5b60..89eb0c224962dc9c83729670a77e3bbb13ed2f98 100644 | 
| --- a/chrome/browser/metrics/metrics_service.cc | 
| +++ b/chrome/browser/metrics/metrics_service.cc | 
| @@ -152,6 +152,7 @@ | 
| #include "base/string_number_conversions.h" | 
| #include "base/threading/platform_thread.h" | 
| #include "base/threading/thread.h" | 
| +#include "base/tracked_objects.h" | 
| #include "base/utf_string_conversions.h" | 
| #include "base/values.h" | 
| #include "chrome/browser/bookmarks/bookmark_model.h" | 
| @@ -164,6 +165,7 @@ | 
| #include "chrome/browser/metrics/metrics_log.h" | 
| #include "chrome/browser/metrics/metrics_log_serializer.h" | 
| #include "chrome/browser/metrics/metrics_reporting_scheduler.h" | 
| +#include "chrome/browser/metrics/tracking_synchronizer.h" | 
| #include "chrome/browser/net/http_pipelining_compatibility_client.h" | 
| #include "chrome/browser/net/network_stats.h" | 
| #include "chrome/browser/prefs/pref_service.h" | 
| @@ -773,7 +775,7 @@ void MetricsService::InitTaskGetHardwareClass( | 
|  | 
| void MetricsService::OnInitTaskGotHardwareClass( | 
| const std::string& hardware_class) { | 
| -  DCHECK_EQ(state_, INIT_TASK_SCHEDULED); | 
| +  DCHECK_EQ(INIT_TASK_SCHEDULED, state_); | 
| hardware_class_ = hardware_class; | 
|  | 
| // Start the next part of the init task: loading plugin information. | 
| @@ -784,11 +786,31 @@ void MetricsService::OnInitTaskGotHardwareClass( | 
|  | 
| void MetricsService::OnInitTaskGotPluginInfo( | 
| const std::vector<webkit::WebPluginInfo>& plugins) { | 
| -  DCHECK_EQ(state_, INIT_TASK_SCHEDULED); | 
| +  DCHECK_EQ(INIT_TASK_SCHEDULED, state_); | 
| plugins_ = plugins; | 
|  | 
| -  if (state_ == INIT_TASK_SCHEDULED) | 
| -    state_ = INIT_TASK_DONE; | 
| +  // Start the next part of the init task: fetching performance data.  This will | 
| +  // call into |FinishedReceivingProfilerData()| when the task completes. | 
| +  chrome_browser_metrics::TrackingSynchronizer::FetchProfilerDataAsynchronously( | 
| +      self_ptr_factory_.GetWeakPtr()); | 
| +} | 
| + | 
| +void MetricsService::ReceivedProfilerData( | 
| +    const tracked_objects::ProcessDataSnapshot& process_data, | 
| +    content::ProcessType process_type) { | 
| +  DCHECK_EQ(INIT_TASK_SCHEDULED, state_); | 
| + | 
| +  // Upon the first callback, create the initial log so that we can immediately | 
| +  // save the profiler data. | 
| +  if (!initial_log_.get()) | 
| +    initial_log_.reset(new MetricsLog(client_id_, session_id_)); | 
| + | 
| +  initial_log_->RecordProfilerData(process_data, process_type); | 
| +} | 
| + | 
| +void MetricsService::FinishedReceivingProfilerData() { | 
| +  DCHECK_EQ(INIT_TASK_SCHEDULED, state_); | 
| +  state_ = INIT_TASK_DONE; | 
| } | 
|  | 
| std::string MetricsService::GenerateClientID() { | 
| @@ -1014,7 +1036,7 @@ void MetricsService::MakeStagedLog() { | 
| // anything, because the server will tell us whether it wants to hear | 
| // from us. | 
| PrepareInitialLog(); | 
| -      DCHECK(state_ == INIT_TASK_DONE); | 
| +      DCHECK_EQ(INIT_TASK_DONE, state_); | 
| log_manager_.LoadPersistedUnsentLogs(); | 
| state_ = INITIAL_LOG_READY; | 
| break; | 
| @@ -1042,16 +1064,17 @@ void MetricsService::MakeStagedLog() { | 
| } | 
|  | 
| void MetricsService::PrepareInitialLog() { | 
| -  DCHECK(state_ == INIT_TASK_DONE); | 
| +  DCHECK_EQ(INIT_TASK_DONE, state_); | 
|  | 
| -  MetricsLog* log = new MetricsLog(client_id_, session_id_); | 
| -  log->set_hardware_class(hardware_class_);  // Adds to initial log. | 
| -  log->RecordEnvironment(plugins_, profile_dictionary_.get()); | 
| +  DCHECK(initial_log_.get()); | 
| +  initial_log_->set_hardware_class(hardware_class_); | 
| +  initial_log_->RecordEnvironment(plugins_, profile_dictionary_.get()); | 
|  | 
| // Histograms only get written to the current log, so make the new log current | 
| // before writing them. | 
| log_manager_.PauseCurrentLog(); | 
| -  log_manager_.BeginLoggingWithLog(log, MetricsLogManager::INITIAL_LOG); | 
| +  log_manager_.BeginLoggingWithLog(initial_log_.release(), | 
| +                                   MetricsLogManager::INITIAL_LOG); | 
| RecordCurrentHistograms(); | 
| log_manager_.FinishCurrentLog(); | 
| log_manager_.ResumePausedLog(); | 
| @@ -1256,7 +1279,7 @@ void MetricsService::OnURLFetchComplete(const content::URLFetcher* source) { | 
| log_manager_.DiscardStagedLog(); | 
|  | 
| if (log_manager_.has_unsent_logs()) | 
| -      DCHECK(state_ < SENDING_CURRENT_LOGS); | 
| +      DCHECK_LT(state_, SENDING_CURRENT_LOGS); | 
| } | 
|  | 
| // Error 400 indicates a problem with the log, not with the server, so | 
|  |