OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/browser/browser_main_loop.h" | 5 #include "content/browser/browser_main_loop.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
9 #include "base/location.h" | 9 #include "base/location.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
11 #include "base/memory/memory_pressure_monitor.h" | 11 #include "base/memory/memory_pressure_monitor.h" |
12 #include "base/metrics/field_trial.h" | 12 #include "base/metrics/field_trial.h" |
13 #include "base/metrics/histogram.h" | 13 #include "base/metrics/histogram.h" |
14 #include "base/pending_task.h" | 14 #include "base/pending_task.h" |
15 #include "base/power_monitor/power_monitor.h" | 15 #include "base/power_monitor/power_monitor.h" |
16 #include "base/power_monitor/power_monitor_device_source.h" | 16 #include "base/power_monitor/power_monitor_device_source.h" |
17 #include "base/process/process_metrics.h" | 17 #include "base/process/process_metrics.h" |
18 #include "base/profiler/scoped_profile.h" | 18 #include "base/profiler/scoped_profile.h" |
19 #include "base/run_loop.h" | 19 #include "base/run_loop.h" |
20 #include "base/single_thread_task_runner.h" | 20 #include "base/single_thread_task_runner.h" |
21 #include "base/strings/string_number_conversions.h" | 21 #include "base/strings/string_number_conversions.h" |
22 #include "base/strings/string_split.h" | 22 #include "base/strings/string_split.h" |
23 #include "base/system_monitor/system_monitor.h" | 23 #include "base/system_monitor/system_monitor.h" |
24 #include "base/thread_task_runner_handle.h" | 24 #include "base/thread_task_runner_handle.h" |
25 #include "base/threading/thread_restrictions.h" | 25 #include "base/threading/thread_restrictions.h" |
26 #include "base/timer/hi_res_timer_manager.h" | 26 #include "base/timer/hi_res_timer_manager.h" |
27 #include "base/trace_event/memory_dump_manager.h" | 27 #include "base/trace_event/memory_dump_manager.h" |
28 #include "base/trace_event/trace_event.h" | 28 #include "base/trace_event/trace_event.h" |
29 #include "components/tracing/trace_config_file.h" | |
30 #include "components/tracing/tracing_switches.h" | 29 #include "components/tracing/tracing_switches.h" |
31 #include "content/browser/browser_thread_impl.h" | 30 #include "content/browser/browser_thread_impl.h" |
32 #include "content/browser/device_sensors/device_inertial_sensor_service.h" | 31 #include "content/browser/device_sensors/device_inertial_sensor_service.h" |
33 #include "content/browser/dom_storage/dom_storage_area.h" | 32 #include "content/browser/dom_storage/dom_storage_area.h" |
34 #include "content/browser/download/save_file_manager.h" | 33 #include "content/browser/download/save_file_manager.h" |
35 #include "content/browser/gamepad/gamepad_service.h" | 34 #include "content/browser/gamepad/gamepad_service.h" |
36 #include "content/browser/gpu/browser_gpu_channel_host_factory.h" | 35 #include "content/browser/gpu/browser_gpu_channel_host_factory.h" |
37 #include "content/browser/gpu/browser_gpu_memory_buffer_manager.h" | 36 #include "content/browser/gpu/browser_gpu_memory_buffer_manager.h" |
38 #include "content/browser/gpu/compositor_util.h" | 37 #include "content/browser/gpu/compositor_util.h" |
39 #include "content/browser/gpu/gpu_data_manager_impl.h" | 38 #include "content/browser/gpu/gpu_data_manager_impl.h" |
(...skipping 344 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
384 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 383 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
385 return g_current_browser_main_loop; | 384 return g_current_browser_main_loop; |
386 } | 385 } |
387 | 386 |
388 BrowserMainLoop::BrowserMainLoop(const MainFunctionParams& parameters) | 387 BrowserMainLoop::BrowserMainLoop(const MainFunctionParams& parameters) |
389 : parameters_(parameters), | 388 : parameters_(parameters), |
390 parsed_command_line_(parameters.command_line), | 389 parsed_command_line_(parameters.command_line), |
391 result_code_(RESULT_CODE_NORMAL_EXIT), | 390 result_code_(RESULT_CODE_NORMAL_EXIT), |
392 created_threads_(false), | 391 created_threads_(false), |
393 // ContentMainRunner should have enabled tracing of the browser process | 392 // ContentMainRunner should have enabled tracing of the browser process |
394 // when kTraceStartup or kTraceConfigFile is in the command line. | 393 // when kTraceStartup is in the command line. |
395 is_tracing_startup_for_duration_( | 394 is_tracing_startup_( |
396 parameters.command_line.HasSwitch(switches::kTraceStartup) || | 395 parameters.command_line.HasSwitch(switches::kTraceStartup)) { |
397 (tracing::TraceConfigFile::GetInstance()->IsEnabled() && | |
398 tracing::TraceConfigFile::GetInstance()->GetStartupDuration() > 0)) { | |
399 DCHECK(!g_current_browser_main_loop); | 396 DCHECK(!g_current_browser_main_loop); |
400 g_current_browser_main_loop = this; | 397 g_current_browser_main_loop = this; |
401 } | 398 } |
402 | 399 |
403 BrowserMainLoop::~BrowserMainLoop() { | 400 BrowserMainLoop::~BrowserMainLoop() { |
404 DCHECK_EQ(this, g_current_browser_main_loop); | 401 DCHECK_EQ(this, g_current_browser_main_loop); |
405 #if !defined(OS_IOS) | 402 #if !defined(OS_IOS) |
406 ui::Clipboard::DestroyClipboardForCurrentThread(); | 403 ui::Clipboard::DestroyClipboardForCurrentThread(); |
407 #endif // !defined(OS_IOS) | 404 #endif // !defined(OS_IOS) |
408 g_current_browser_main_loop = NULL; | 405 g_current_browser_main_loop = NULL; |
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
574 system_message_window_.reset(new SystemMessageWindowWin); | 571 system_message_window_.reset(new SystemMessageWindowWin); |
575 #endif | 572 #endif |
576 | 573 |
577 if (parts_) | 574 if (parts_) |
578 parts_->PostMainMessageLoopStart(); | 575 parts_->PostMainMessageLoopStart(); |
579 | 576 |
580 #if !defined(OS_IOS) | 577 #if !defined(OS_IOS) |
581 // Start tracing to a file if needed. Only do this after starting the main | 578 // Start tracing to a file if needed. Only do this after starting the main |
582 // message loop to avoid calling MessagePumpForUI::ScheduleWork() before | 579 // message loop to avoid calling MessagePumpForUI::ScheduleWork() before |
583 // MessagePumpForUI::Start() as it will crash the browser. | 580 // MessagePumpForUI::Start() as it will crash the browser. |
584 if (is_tracing_startup_for_duration_) { | 581 if (is_tracing_startup_) { |
585 TRACE_EVENT0("startup", "BrowserMainLoop::InitStartupTracingForDuration"); | 582 TRACE_EVENT0("startup", "BrowserMainLoop::InitStartupTracing"); |
586 InitStartupTracingForDuration(parsed_command_line_); | 583 InitStartupTracing(parsed_command_line_); |
587 } | 584 } |
588 #endif // !defined(OS_IOS) | 585 #endif // !defined(OS_IOS) |
589 | 586 |
590 #if defined(OS_ANDROID) | 587 #if defined(OS_ANDROID) |
591 { | 588 { |
592 TRACE_EVENT0("startup", "BrowserMainLoop::Subsystem:SurfaceTextureManager"); | 589 TRACE_EVENT0("startup", "BrowserMainLoop::Subsystem:SurfaceTextureManager"); |
593 if (parsed_command_line_.HasSwitch(switches::kSingleProcess)) { | 590 if (parsed_command_line_.HasSwitch(switches::kSingleProcess)) { |
594 SurfaceTextureManager::SetInstance( | 591 SurfaceTextureManager::SetInstance( |
595 InProcessSurfaceTextureManager::GetInstance()); | 592 InProcessSurfaceTextureManager::GetInstance()); |
596 } else { | 593 } else { |
(...skipping 715 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1312 *parameters_.ui_task); | 1309 *parameters_.ui_task); |
1313 } | 1310 } |
1314 | 1311 |
1315 base::RunLoop run_loop; | 1312 base::RunLoop run_loop; |
1316 run_loop.Run(); | 1313 run_loop.Run(); |
1317 #endif | 1314 #endif |
1318 } | 1315 } |
1319 | 1316 |
1320 base::FilePath BrowserMainLoop::GetStartupTraceFileName( | 1317 base::FilePath BrowserMainLoop::GetStartupTraceFileName( |
1321 const base::CommandLine& command_line) const { | 1318 const base::CommandLine& command_line) const { |
1322 base::FilePath trace_file; | 1319 base::FilePath trace_file = command_line.GetSwitchValuePath( |
1323 if (command_line.HasSwitch(switches::kTraceStartup)) { | 1320 switches::kTraceStartupFile); |
1324 trace_file = command_line.GetSwitchValuePath( | 1321 // trace_file = "none" means that startup events will show up for the next |
1325 switches::kTraceStartupFile); | 1322 // begin/end tracing (via about:tracing or AutomationProxy::BeginTracing/ |
1326 // trace_file = "none" means that startup events will show up for the next | 1323 // EndTracing, for example). |
1327 // begin/end tracing (via about:tracing or AutomationProxy::BeginTracing/ | 1324 if (trace_file == base::FilePath().AppendASCII("none")) |
1328 // EndTracing, for example). | 1325 return trace_file; |
1329 if (trace_file == base::FilePath().AppendASCII("none")) | |
1330 return trace_file; | |
1331 | 1326 |
1332 if (trace_file.empty()) { | 1327 if (trace_file.empty()) { |
1333 #if defined(OS_ANDROID) | |
1334 TracingControllerAndroid::GenerateTracingFilePath(&trace_file); | |
1335 #else | |
1336 // Default to saving the startup trace into the current dir. | |
1337 trace_file = base::FilePath().AppendASCII("chrometrace.log"); | |
1338 #endif | |
1339 } | |
1340 } else { | |
1341 #if defined(OS_ANDROID) | 1328 #if defined(OS_ANDROID) |
1342 TracingControllerAndroid::GenerateTracingFilePath(&trace_file); | 1329 TracingControllerAndroid::GenerateTracingFilePath(&trace_file); |
1343 #else | 1330 #else |
1344 trace_file = tracing::TraceConfigFile::GetInstance()->GetResultFile(); | 1331 // Default to saving the startup trace into the current dir. |
| 1332 trace_file = base::FilePath().AppendASCII("chrometrace.log"); |
1345 #endif | 1333 #endif |
1346 } | 1334 } |
1347 | 1335 |
1348 return trace_file; | 1336 return trace_file; |
1349 } | 1337 } |
1350 | 1338 |
1351 void BrowserMainLoop::InitStartupTracingForDuration( | 1339 void BrowserMainLoop::InitStartupTracing( |
1352 const base::CommandLine& command_line) { | 1340 const base::CommandLine& command_line) { |
1353 DCHECK(is_tracing_startup_for_duration_); | 1341 DCHECK(is_tracing_startup_); |
1354 | 1342 |
1355 startup_trace_file_ = GetStartupTraceFileName(parsed_command_line_); | 1343 startup_trace_file_ = GetStartupTraceFileName(parsed_command_line_); |
1356 | 1344 |
| 1345 std::string delay_str = command_line.GetSwitchValueASCII( |
| 1346 switches::kTraceStartupDuration); |
1357 int delay_secs = 5; | 1347 int delay_secs = 5; |
1358 if (command_line.HasSwitch(switches::kTraceStartup)) { | 1348 if (!delay_str.empty() && !base::StringToInt(delay_str, &delay_secs)) { |
1359 std::string delay_str = command_line.GetSwitchValueASCII( | 1349 DLOG(WARNING) << "Could not parse --" << switches::kTraceStartupDuration |
1360 switches::kTraceStartupDuration); | 1350 << "=" << delay_str << " defaulting to 5 (secs)"; |
1361 if (!delay_str.empty() && !base::StringToInt(delay_str, &delay_secs)) { | 1351 delay_secs = 5; |
1362 DLOG(WARNING) << "Could not parse --" << switches::kTraceStartupDuration | |
1363 << "=" << delay_str << " defaulting to 5 (secs)"; | |
1364 delay_secs = 5; | |
1365 } | |
1366 } else { | |
1367 delay_secs = tracing::TraceConfigFile::GetInstance()->GetStartupDuration(); | |
1368 } | 1352 } |
1369 | 1353 |
1370 startup_trace_timer_.Start(FROM_HERE, | 1354 startup_trace_timer_.Start(FROM_HERE, |
1371 base::TimeDelta::FromSeconds(delay_secs), | 1355 base::TimeDelta::FromSeconds(delay_secs), |
1372 this, | 1356 this, |
1373 &BrowserMainLoop::EndStartupTracing); | 1357 &BrowserMainLoop::EndStartupTracing); |
1374 } | 1358 } |
1375 | 1359 |
1376 void BrowserMainLoop::EndStartupTracing() { | 1360 void BrowserMainLoop::EndStartupTracing() { |
1377 DCHECK(is_tracing_startup_for_duration_); | 1361 DCHECK(is_tracing_startup_); |
1378 | 1362 |
1379 is_tracing_startup_for_duration_ = false; | 1363 is_tracing_startup_ = false; |
1380 TracingController::GetInstance()->DisableRecording( | 1364 TracingController::GetInstance()->DisableRecording( |
1381 TracingController::CreateFileSink( | 1365 TracingController::CreateFileSink( |
1382 startup_trace_file_, | 1366 startup_trace_file_, |
1383 base::Bind(OnStoppedStartupTracing, startup_trace_file_))); | 1367 base::Bind(OnStoppedStartupTracing, startup_trace_file_))); |
1384 } | 1368 } |
1385 | 1369 |
1386 } // namespace content | 1370 } // namespace content |
OLD | NEW |