Chromium Code Reviews| Index: chrome/browser/chrome_browser_main.cc |
| diff --git a/chrome/browser/chrome_browser_main.cc b/chrome/browser/chrome_browser_main.cc |
| index 3af4c611d1d4f5ae87ea353d7983a8d746302712..14b2bbe2d985dd20a398c000c866a3dc314b0b7c 100644 |
| --- a/chrome/browser/chrome_browser_main.cc |
| +++ b/chrome/browser/chrome_browser_main.cc |
| @@ -1121,12 +1121,13 @@ void ChromeBrowserMainParts::PostBrowserStart() { |
| int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() { |
| TRACE_EVENT0("startup", "ChromeBrowserMainParts::PreMainMessageLoopRunImpl"); |
| SCOPED_UMA_HISTOGRAM_LONG_TIMER("Startup.PreMainMessageLoopRunImplLongTime"); |
| + const base::TimeTicks start_time_step1 = base::TimeTicks::Now(); |
| // Android updates the metrics service dynamically depending on whether the |
| // application is in the foreground or not. Do not start here. |
| #if !defined(OS_ANDROID) |
| // Now that the file thread has been started, start recording. |
| StartMetricsRecording(); |
| -#endif |
| +#endif // !defined(OS_ANDROID) |
| if (!base::debug::BeingDebugged()) { |
| // Create watchdog thread after creating all other threads because it will |
| @@ -1161,7 +1162,7 @@ int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() { |
| ui::SelectFileDialog::SetFactory(new ChromeSelectFileDialogFactory( |
| BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO))); |
| -#endif |
| +#endif // OS_WIN |
|
Alexei Svitkine (slow)
2015/03/02 22:11:55
defined()
Lei Zhang
2015/03/02 22:22:29
nit: Please be consistent and add defined(). Ditto
|
| if (parsed_command_line().HasSwitch(switches::kMakeDefaultBrowser)) { |
| return ShellIntegration::SetAsDefaultBrowser() ? |
| @@ -1172,7 +1173,7 @@ int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() { |
| #if defined(USE_AURA) |
| // Make sure aura::Env has been initialized. |
| CHECK(aura::Env::GetInstance()); |
| -#endif |
| +#endif // defined(USE_AURA) |
| // Android doesn't support extensions and doesn't implement ProcessSingleton. |
| #if !defined(OS_ANDROID) |
| @@ -1205,7 +1206,8 @@ int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() { |
| #if defined(OS_POSIX) && !defined(OS_MACOSX) |
| printf("%s\n", base::SysWideToNativeMB(base::UTF16ToWide( |
| l10n_util::GetStringUTF16(IDS_USED_EXISTING_BROWSER))).c_str()); |
| -#endif |
| +#endif // OS_POSIX && !defined(OS_MACOSX) |
|
Alexei Svitkine (slow)
2015/03/02 22:11:55
Nit: defined(OS_POSIX) && !defined(OS_MACOSX)
#if
|
| + |
| // Having a differentiated return type for testing allows for tests to |
| // verify proper handling of some switches. When not testing, stick to |
| // the standard Unix convention of returning zero when things went as |
| @@ -1262,7 +1264,7 @@ int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() { |
| #else |
| // We don't support retention experiments on Mac or Linux. |
| return content::RESULT_CODE_NORMAL_EXIT; |
| -#endif // defined(OS_WIN) |
| +#endif // OS_WIN |
| } |
| #if defined(OS_WIN) |
| @@ -1278,12 +1280,12 @@ int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() { |
| // obtained but before potentially creating the first run sentinel). |
| if (ChromeBrowserMainPartsWin::CheckMachineLevelInstall()) |
| return chrome::RESULT_CODE_MACHINE_LEVEL_INSTALL_EXISTS; |
| -#endif // defined(OS_WIN) |
| +#endif // OS_WIN |
| #if defined(OS_LINUX) && !defined(OS_CHROMEOS) |
| if (sxs_linux::ShouldMigrateUserDataDir()) |
| return sxs_linux::MigrateUserDataDir(); |
| -#endif // defined(OS_LINUX) && !defined(OS_CHROMEOS) |
| +#endif // OS_LINUX && !defined(OS_CHROMEOS) |
| // Desktop construction occurs here, (required before profile creation). |
| PreProfileInit(); |
| @@ -1293,12 +1295,20 @@ int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() { |
| metrics::MetricsService::SetExecutionPhase( |
| metrics::MetricsService::CREATE_PROFILE, |
| g_browser_process->local_state()); |
| + |
| + UMA_HISTOGRAM_TIMES("Startup.PreMainMessageLoopRunImplStep1Time", |
| + base::TimeTicks::Now() - start_time_step1); |
| + |
| + // This step is costly and is already measured in Startup.CreateFirstProfile |
| + // and more directly Profile.CreateAndInitializeProfile. |
| profile_ = CreatePrimaryProfile(parameters(), |
| user_data_dir_, |
| parsed_command_line()); |
| if (!profile_) |
| return content::RESULT_CODE_NORMAL_EXIT; |
| + const base::TimeTicks start_time_step2 = base::TimeTicks::Now(); |
| + |
| #if !defined(OS_ANDROID) |
| // The first run sentinel must be created after the process singleton was |
| // grabbed and no early return paths were otherwise hit above. |
| @@ -1309,7 +1319,7 @@ int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() { |
| // Autoload any profiles which are running background apps. |
| // TODO(rlp): Do this on a separate thread. See http://crbug.com/99075. |
| browser_process_->profile_manager()->AutoloadProfiles(); |
| -#endif |
| +#endif // ENABLE_BACKGROUND |
|
Alexei Svitkine (slow)
2015/03/02 22:11:55
defined()
|
| // Post-profile init --------------------------------------------------------- |
| TranslateService::Initialize(); |
| @@ -1325,7 +1335,7 @@ int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() { |
| NaClBrowserDelegateImpl* delegate = |
| new NaClBrowserDelegateImpl(browser_process_->profile_manager()); |
| nacl::NaClBrowser::SetDelegate(delegate); |
| -#endif |
| +#endif // !defined(DISABLE_NACL) |
| // TODO(stevenjb): Move WIN and MACOSX specific code to appropriate Parts. |
| // (requires supporting early exit). |
| @@ -1403,7 +1413,7 @@ int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() { |
| RLZTracker::InitRlzFromProfileDelayed( |
| profile_, first_run::IsChromeFirstRun(), ping_delay < 0, |
| base::TimeDelta::FromMilliseconds(abs(ping_delay))); |
| -#endif // defined(ENABLE_RLZ) && !defined(OS_CHROMEOS) |
| +#endif // ENABLE_RLZ && !defined(OS_CHROMEOS) |
|
Alexei Svitkine (slow)
2015/03/02 22:11:55
Change back to defined()
|
| // Configure modules that need access to resources. |
| net::NetModule::SetResourceProvider(chrome_common_net::NetResourceProvider); |
| @@ -1446,7 +1456,7 @@ int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() { |
| parsed_command_line().GetSwitchValuePath(switches::kDebugPrint); |
| printing::PrintedDocument::set_debug_dump_path(path); |
| } |
| -#endif |
| +#endif // ENABLE_PRINT_PREVIEW && !defined(OFFICIAL_BUILD) |
|
Alexei Svitkine (slow)
2015/03/02 22:11:55
Ditto.
|
| HandleTestParameters(parsed_command_line()); |
| browser_process_->metrics_service()->RecordBreakpadHasDebugger( |
| @@ -1471,7 +1481,7 @@ int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() { |
| #if !defined(OS_ANDROID) |
| // Start watching for a hang. |
| browser_process_->metrics_service()->LogNeedForCleanShutdown(); |
| -#endif |
| +#endif // !defined(OS_ANDROID) |
| #if defined(ENABLE_PRINT_PREVIEW) |
| // Create the instance of the cloud print proxy service so that it can launch |
| @@ -1481,7 +1491,7 @@ int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() { |
| // BrowserContextKeyedServiceFactory::ServiceIsCreatedWithBrowserContext() |
| // instead? |
| CloudPrintProxyServiceFactory::GetForProfile(profile_); |
| -#endif |
| +#endif // ENABLE_PRINT_PREVIEW |
|
Alexei Svitkine (slow)
2015/03/02 22:11:54
Ditto.
|
| // Start watching all browser threads for responsiveness. |
| metrics::MetricsService::SetExecutionPhase( |
| @@ -1491,14 +1501,14 @@ int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() { |
| #if defined(OS_ANDROID) |
| ThreadWatcherAndroid::RegisterApplicationStatusListener(); |
| -#endif |
| +#endif // OS_ANDROID |
|
Alexei Svitkine (slow)
2015/03/02 22:11:54
Ditto.
|
| #if !defined(DISABLE_NACL) |
| BrowserThread::PostTask( |
| BrowserThread::IO, |
| FROM_HERE, |
| base::Bind(nacl::NaClProcessHost::EarlyStartup)); |
| -#endif |
| +#endif // !defined(DISABLE_NACL) |
| // Make sure initial prefs are recorded |
| PrefMetricsService::Factory::GetForProfile(profile_); |
| @@ -1544,17 +1554,24 @@ int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() { |
| #else |
| std::vector<Profile*> last_opened_profiles = |
| g_browser_process->profile_manager()->GetLastOpenedProfiles(); |
| -#endif |
| +#endif // OS_CHROMEOS |
|
Alexei Svitkine (slow)
2015/03/02 22:11:55
Ditto.
|
| - if (browser_creator_->Start(parsed_command_line(), base::FilePath(), |
| - profile_, last_opened_profiles)) { |
| + UMA_HISTOGRAM_TIMES("Startup.PreMainMessageLoopRunImplStep2Time", |
| + base::TimeTicks::Now() - start_time_step2); |
| + |
| + // This step is costly and is already measured in |
| + // Startup.StartupBrowserCreator_Start. |
| + bool started = browser_creator_->Start( |
| + parsed_command_line(), base::FilePath(), profile_, last_opened_profiles); |
| + const base::TimeTicks start_time_step3 = base::TimeTicks::Now(); |
| + if (started) { |
| #if defined(OS_WIN) || (defined(OS_LINUX) && !defined(OS_CHROMEOS)) |
| // Initialize autoupdate timer. Timer callback costs basically nothing |
| // when browser is not in persistent mode, so it's OK to let it ride on |
| // the main thread. This needs to be done here because we don't want |
| // to start the timer when Chrome is run inside a test harness. |
| browser_process_->StartAutoupdateTimer(); |
| -#endif |
| +#endif // OS_WIN || (OS_LINUX && !defined(OS_CHROMEOS)) |
| #if defined(OS_LINUX) && !defined(OS_CHROMEOS) |
| // On Linux, the running exe will be updated if an upgrade becomes |
| @@ -1562,7 +1579,7 @@ int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() { |
| // modified time of the exe, so we can compare to determine if there is |
| // an upgrade while the browser is kept alive by a persistent extension. |
| upgrade_util::SaveLastModifiedTimeOfExe(); |
| -#endif |
| +#endif // OS_LINUX && !defined(OS_CHROMEOS) |
| // Record now as the last successful chrome start. |
| GoogleUpdateSettings::SetLastRunTime(); |
| @@ -1572,7 +1589,7 @@ int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() { |
| // because Start() will add things to it while creating the main window. |
| if (parameters().autorelease_pool) |
| parameters().autorelease_pool->Recycle(); |
| -#endif |
| +#endif // defined(OS_MACOSX) |
| base::TimeDelta delay = base::TimeTicks::Now() - browser_open_start; |
| UMA_HISTOGRAM_LONG_TIMES_100("Startup.BrowserOpenTabs", delay); |
| @@ -1589,7 +1606,7 @@ int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() { |
| #if defined(OS_WIN) |
| variations_service->StartGoogleUpdateRegistrySync(); |
| -#endif |
| +#endif // OS_WIN |
| } |
| translate::TranslateDownloadManager::RequestLanguageList( |
| @@ -1605,7 +1622,7 @@ int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() { |
| #if !defined(OS_LINUX) || defined(OS_CHROMEOS) // http://crbug.com/426393 |
| if (g_browser_process->metrics_service()->reporting_active()) |
| content::StartPowerUsageMonitor(); |
| -#endif |
| +#endif // !defined(OS_LINUX) || defined(OS_CHROMEOS) |
| process_power_collector_.reset(new ProcessPowerCollector); |
| process_power_collector_->Initialize(); |
| @@ -1621,11 +1638,17 @@ int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() { |
| #if defined(OS_ANDROID) |
| // We never run the C++ main loop on Android, since the UI thread message |
| // loop is controlled by the OS, so this is as close as we can get to |
| - // the start of the main loop |
| + // the start of the main loop. |
| if (result_code_ <= 0) { |
| RecordBrowserStartupTime(); |
| } |
| -#endif |
| +#endif // OS_ANDROID |
| + |
| +#if !defined(OS_ANDROID) |
| + UMA_HISTOGRAM_TIMES("Startup.PreMainMessageLoopRunImplStep3Time", |
| + base::TimeTicks::Now() - start_time_step3); |
| +#endif // !defined(OS_ANDROID) |
| + |
| return result_code_; |
| } |