| 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 <stddef.h> | 7 #include <stddef.h> |
| 8 |
| 8 #include <utility> | 9 #include <utility> |
| 9 | 10 |
| 10 #include "base/bind.h" | 11 #include "base/bind.h" |
| 11 #include "base/command_line.h" | 12 #include "base/command_line.h" |
| 12 #include "base/feature_list.h" | 13 #include "base/feature_list.h" |
| 13 #include "base/location.h" | 14 #include "base/location.h" |
| 14 #include "base/logging.h" | 15 #include "base/logging.h" |
| 15 #include "base/macros.h" | 16 #include "base/macros.h" |
| 16 #include "base/memory/memory_pressure_monitor.h" | 17 #include "base/memory/memory_pressure_monitor.h" |
| 18 #include "base/memory/ptr_util.h" |
| 17 #include "base/metrics/field_trial.h" | 19 #include "base/metrics/field_trial.h" |
| 18 #include "base/metrics/histogram.h" | 20 #include "base/metrics/histogram.h" |
| 19 #include "base/pending_task.h" | 21 #include "base/pending_task.h" |
| 20 #include "base/power_monitor/power_monitor.h" | 22 #include "base/power_monitor/power_monitor.h" |
| 21 #include "base/power_monitor/power_monitor_device_source.h" | 23 #include "base/power_monitor/power_monitor_device_source.h" |
| 22 #include "base/process/process_metrics.h" | 24 #include "base/process/process_metrics.h" |
| 23 #include "base/profiler/scoped_profile.h" | 25 #include "base/profiler/scoped_profile.h" |
| 24 #include "base/run_loop.h" | 26 #include "base/run_loop.h" |
| 25 #include "base/single_thread_task_runner.h" | 27 #include "base/single_thread_task_runner.h" |
| 26 #include "base/strings/string_number_conversions.h" | 28 #include "base/strings/string_number_conversions.h" |
| (...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 189 #endif | 191 #endif |
| 190 | 192 |
| 191 namespace content { | 193 namespace content { |
| 192 namespace { | 194 namespace { |
| 193 | 195 |
| 194 #if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_ANDROID) | 196 #if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_ANDROID) |
| 195 void SetupSandbox(const base::CommandLine& parsed_command_line) { | 197 void SetupSandbox(const base::CommandLine& parsed_command_line) { |
| 196 TRACE_EVENT0("startup", "SetupSandbox"); | 198 TRACE_EVENT0("startup", "SetupSandbox"); |
| 197 base::FilePath sandbox_binary; | 199 base::FilePath sandbox_binary; |
| 198 | 200 |
| 199 scoped_ptr<sandbox::SetuidSandboxHost> setuid_sandbox_host( | 201 std::unique_ptr<sandbox::SetuidSandboxHost> setuid_sandbox_host( |
| 200 sandbox::SetuidSandboxHost::Create()); | 202 sandbox::SetuidSandboxHost::Create()); |
| 201 | 203 |
| 202 const bool want_setuid_sandbox = | 204 const bool want_setuid_sandbox = |
| 203 !parsed_command_line.HasSwitch(switches::kNoSandbox) && | 205 !parsed_command_line.HasSwitch(switches::kNoSandbox) && |
| 204 !parsed_command_line.HasSwitch(switches::kDisableSetuidSandbox) && | 206 !parsed_command_line.HasSwitch(switches::kDisableSetuidSandbox) && |
| 205 !setuid_sandbox_host->IsDisabledViaEnvironment(); | 207 !setuid_sandbox_host->IsDisabledViaEnvironment(); |
| 206 | 208 |
| 207 static const char no_suid_error[] = | 209 static const char no_suid_error[] = |
| 208 "Running without the SUID sandbox! See " | 210 "Running without the SUID sandbox! See " |
| 209 "https://chromium.googlesource.com/chromium/src/+/master/docs/linux_suid_s
andbox_development.md " | 211 "https://chromium.googlesource.com/chromium/src/+/master/docs/linux_suid_s
andbox_development.md " |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 291 void OnStoppedStartupTracing(const base::FilePath& trace_file) { | 293 void OnStoppedStartupTracing(const base::FilePath& trace_file) { |
| 292 VLOG(0) << "Completed startup tracing to " << trace_file.value(); | 294 VLOG(0) << "Completed startup tracing to " << trace_file.value(); |
| 293 } | 295 } |
| 294 | 296 |
| 295 // Disable optimizations for this block of functions so the compiler doesn't | 297 // Disable optimizations for this block of functions so the compiler doesn't |
| 296 // merge them all together. This makes it possible to tell what thread was | 298 // merge them all together. This makes it possible to tell what thread was |
| 297 // unresponsive by inspecting the callstack. | 299 // unresponsive by inspecting the callstack. |
| 298 MSVC_DISABLE_OPTIMIZE() | 300 MSVC_DISABLE_OPTIMIZE() |
| 299 MSVC_PUSH_DISABLE_WARNING(4748) | 301 MSVC_PUSH_DISABLE_WARNING(4748) |
| 300 | 302 |
| 301 NOINLINE void ResetThread_DB(scoped_ptr<BrowserProcessSubThread> thread) { | 303 NOINLINE void ResetThread_DB(std::unique_ptr<BrowserProcessSubThread> thread) { |
| 302 volatile int inhibit_comdat = __LINE__; | 304 volatile int inhibit_comdat = __LINE__; |
| 303 ALLOW_UNUSED_LOCAL(inhibit_comdat); | 305 ALLOW_UNUSED_LOCAL(inhibit_comdat); |
| 304 thread.reset(); | 306 thread.reset(); |
| 305 } | 307 } |
| 306 | 308 |
| 307 NOINLINE void ResetThread_FILE(scoped_ptr<BrowserProcessSubThread> thread) { | 309 NOINLINE void ResetThread_FILE( |
| 310 std::unique_ptr<BrowserProcessSubThread> thread) { |
| 308 volatile int inhibit_comdat = __LINE__; | 311 volatile int inhibit_comdat = __LINE__; |
| 309 ALLOW_UNUSED_LOCAL(inhibit_comdat); | 312 ALLOW_UNUSED_LOCAL(inhibit_comdat); |
| 310 thread.reset(); | 313 thread.reset(); |
| 311 } | 314 } |
| 312 | 315 |
| 313 NOINLINE void ResetThread_FILE_USER_BLOCKING( | 316 NOINLINE void ResetThread_FILE_USER_BLOCKING( |
| 314 scoped_ptr<BrowserProcessSubThread> thread) { | 317 std::unique_ptr<BrowserProcessSubThread> thread) { |
| 315 volatile int inhibit_comdat = __LINE__; | 318 volatile int inhibit_comdat = __LINE__; |
| 316 ALLOW_UNUSED_LOCAL(inhibit_comdat); | 319 ALLOW_UNUSED_LOCAL(inhibit_comdat); |
| 317 thread.reset(); | 320 thread.reset(); |
| 318 } | 321 } |
| 319 | 322 |
| 320 NOINLINE void ResetThread_PROCESS_LAUNCHER( | 323 NOINLINE void ResetThread_PROCESS_LAUNCHER( |
| 321 scoped_ptr<BrowserProcessSubThread> thread) { | 324 std::unique_ptr<BrowserProcessSubThread> thread) { |
| 322 volatile int inhibit_comdat = __LINE__; | 325 volatile int inhibit_comdat = __LINE__; |
| 323 ALLOW_UNUSED_LOCAL(inhibit_comdat); | 326 ALLOW_UNUSED_LOCAL(inhibit_comdat); |
| 324 thread.reset(); | 327 thread.reset(); |
| 325 } | 328 } |
| 326 | 329 |
| 327 NOINLINE void ResetThread_CACHE(scoped_ptr<BrowserProcessSubThread> thread) { | 330 NOINLINE void ResetThread_CACHE( |
| 331 std::unique_ptr<BrowserProcessSubThread> thread) { |
| 328 volatile int inhibit_comdat = __LINE__; | 332 volatile int inhibit_comdat = __LINE__; |
| 329 ALLOW_UNUSED_LOCAL(inhibit_comdat); | 333 ALLOW_UNUSED_LOCAL(inhibit_comdat); |
| 330 thread.reset(); | 334 thread.reset(); |
| 331 } | 335 } |
| 332 | 336 |
| 333 NOINLINE void ResetThread_IO(scoped_ptr<BrowserProcessSubThread> thread) { | 337 NOINLINE void ResetThread_IO(std::unique_ptr<BrowserProcessSubThread> thread) { |
| 334 volatile int inhibit_comdat = __LINE__; | 338 volatile int inhibit_comdat = __LINE__; |
| 335 ALLOW_UNUSED_LOCAL(inhibit_comdat); | 339 ALLOW_UNUSED_LOCAL(inhibit_comdat); |
| 336 thread.reset(); | 340 thread.reset(); |
| 337 } | 341 } |
| 338 | 342 |
| 339 NOINLINE void ResetThread_IndexedDb(scoped_ptr<base::Thread> thread) { | 343 NOINLINE void ResetThread_IndexedDb(std::unique_ptr<base::Thread> thread) { |
| 340 volatile int inhibit_comdat = __LINE__; | 344 volatile int inhibit_comdat = __LINE__; |
| 341 ALLOW_UNUSED_LOCAL(inhibit_comdat); | 345 ALLOW_UNUSED_LOCAL(inhibit_comdat); |
| 342 thread.reset(); | 346 thread.reset(); |
| 343 } | 347 } |
| 344 | 348 |
| 345 MSVC_POP_WARNING() | 349 MSVC_POP_WARNING() |
| 346 MSVC_ENABLE_OPTIMIZE(); | 350 MSVC_ENABLE_OPTIMIZE(); |
| 347 | 351 |
| 348 #if defined(OS_WIN) | 352 #if defined(OS_WIN) |
| 349 // Creates a memory pressure monitor using automatic thresholds, or those | 353 // Creates a memory pressure monitor using automatic thresholds, or those |
| (...skipping 28 matching lines...) Expand all Loading... |
| 378 | 382 |
| 379 // For measuring memory usage after each task. Behind a command line flag. | 383 // For measuring memory usage after each task. Behind a command line flag. |
| 380 class BrowserMainLoop::MemoryObserver : public base::MessageLoop::TaskObserver { | 384 class BrowserMainLoop::MemoryObserver : public base::MessageLoop::TaskObserver { |
| 381 public: | 385 public: |
| 382 MemoryObserver() {} | 386 MemoryObserver() {} |
| 383 ~MemoryObserver() override {} | 387 ~MemoryObserver() override {} |
| 384 | 388 |
| 385 void WillProcessTask(const base::PendingTask& pending_task) override {} | 389 void WillProcessTask(const base::PendingTask& pending_task) override {} |
| 386 | 390 |
| 387 void DidProcessTask(const base::PendingTask& pending_task) override { | 391 void DidProcessTask(const base::PendingTask& pending_task) override { |
| 388 scoped_ptr<base::ProcessMetrics> process_metrics( | 392 std::unique_ptr<base::ProcessMetrics> process_metrics( |
| 389 base::ProcessMetrics::CreateCurrentProcessMetrics()); | 393 base::ProcessMetrics::CreateCurrentProcessMetrics()); |
| 390 size_t private_bytes; | 394 size_t private_bytes; |
| 391 process_metrics->GetMemoryBytes(&private_bytes, NULL); | 395 process_metrics->GetMemoryBytes(&private_bytes, NULL); |
| 392 LOCAL_HISTOGRAM_MEMORY_KB("Memory.BrowserUsed", private_bytes >> 10); | 396 LOCAL_HISTOGRAM_MEMORY_KB("Memory.BrowserUsed", private_bytes >> 10); |
| 393 } | 397 } |
| 394 private: | 398 private: |
| 395 DISALLOW_COPY_AND_ASSIGN(MemoryObserver); | 399 DISALLOW_COPY_AND_ASSIGN(MemoryObserver); |
| 396 }; | 400 }; |
| 397 | 401 |
| 398 | 402 |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 539 InitializeMainThread(); | 543 InitializeMainThread(); |
| 540 } | 544 } |
| 541 | 545 |
| 542 void BrowserMainLoop::PostMainMessageLoopStart() { | 546 void BrowserMainLoop::PostMainMessageLoopStart() { |
| 543 { | 547 { |
| 544 TRACE_EVENT0("startup", "BrowserMainLoop::Subsystem:SystemMonitor"); | 548 TRACE_EVENT0("startup", "BrowserMainLoop::Subsystem:SystemMonitor"); |
| 545 system_monitor_.reset(new base::SystemMonitor); | 549 system_monitor_.reset(new base::SystemMonitor); |
| 546 } | 550 } |
| 547 { | 551 { |
| 548 TRACE_EVENT0("startup", "BrowserMainLoop::Subsystem:PowerMonitor"); | 552 TRACE_EVENT0("startup", "BrowserMainLoop::Subsystem:PowerMonitor"); |
| 549 scoped_ptr<base::PowerMonitorSource> power_monitor_source( | 553 std::unique_ptr<base::PowerMonitorSource> power_monitor_source( |
| 550 new base::PowerMonitorDeviceSource()); | 554 new base::PowerMonitorDeviceSource()); |
| 551 power_monitor_.reset( | 555 power_monitor_.reset( |
| 552 new base::PowerMonitor(std::move(power_monitor_source))); | 556 new base::PowerMonitor(std::move(power_monitor_source))); |
| 553 } | 557 } |
| 554 { | 558 { |
| 555 TRACE_EVENT0("startup", "BrowserMainLoop::Subsystem:HighResTimerManager"); | 559 TRACE_EVENT0("startup", "BrowserMainLoop::Subsystem:HighResTimerManager"); |
| 556 hi_res_timer_manager_.reset(new base::HighResolutionTimerManager); | 560 hi_res_timer_manager_.reset(new base::HighResolutionTimerManager); |
| 557 } | 561 } |
| 558 { | 562 { |
| 559 TRACE_EVENT0("startup", "BrowserMainLoop::Subsystem:NetworkChangeNotifier"); | 563 TRACE_EVENT0("startup", "BrowserMainLoop::Subsystem:NetworkChangeNotifier"); |
| 560 network_change_notifier_.reset(net::NetworkChangeNotifier::Create()); | 564 network_change_notifier_.reset(net::NetworkChangeNotifier::Create()); |
| (...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 751 return result_code_; | 755 return result_code_; |
| 752 } | 756 } |
| 753 | 757 |
| 754 void BrowserMainLoop::CreateStartupTasks() { | 758 void BrowserMainLoop::CreateStartupTasks() { |
| 755 TRACE_EVENT0("startup", "BrowserMainLoop::CreateStartupTasks"); | 759 TRACE_EVENT0("startup", "BrowserMainLoop::CreateStartupTasks"); |
| 756 TRACK_SCOPED_REGION("Startup", "BrowserMainLoop::CreateStartupTasks"); | 760 TRACK_SCOPED_REGION("Startup", "BrowserMainLoop::CreateStartupTasks"); |
| 757 | 761 |
| 758 // First time through, we really want to create all the tasks | 762 // First time through, we really want to create all the tasks |
| 759 if (!startup_task_runner_.get()) { | 763 if (!startup_task_runner_.get()) { |
| 760 #if defined(OS_ANDROID) | 764 #if defined(OS_ANDROID) |
| 761 startup_task_runner_ = make_scoped_ptr( | 765 startup_task_runner_ = base::WrapUnique( |
| 762 new StartupTaskRunner(base::Bind(&BrowserStartupComplete), | 766 new StartupTaskRunner(base::Bind(&BrowserStartupComplete), |
| 763 base::ThreadTaskRunnerHandle::Get())); | 767 base::ThreadTaskRunnerHandle::Get())); |
| 764 #else | 768 #else |
| 765 startup_task_runner_ = make_scoped_ptr( | 769 startup_task_runner_ = base::WrapUnique(new StartupTaskRunner( |
| 766 new StartupTaskRunner(base::Callback<void(int)>(), | 770 base::Callback<void(int)>(), base::ThreadTaskRunnerHandle::Get())); |
| 767 base::ThreadTaskRunnerHandle::Get())); | |
| 768 #endif | 771 #endif |
| 769 StartupTask pre_create_threads = | 772 StartupTask pre_create_threads = |
| 770 base::Bind(&BrowserMainLoop::PreCreateThreads, base::Unretained(this)); | 773 base::Bind(&BrowserMainLoop::PreCreateThreads, base::Unretained(this)); |
| 771 startup_task_runner_->AddTask(pre_create_threads); | 774 startup_task_runner_->AddTask(pre_create_threads); |
| 772 | 775 |
| 773 StartupTask create_threads = | 776 StartupTask create_threads = |
| 774 base::Bind(&BrowserMainLoop::CreateThreads, base::Unretained(this)); | 777 base::Bind(&BrowserMainLoop::CreateThreads, base::Unretained(this)); |
| 775 startup_task_runner_->AddTask(create_threads); | 778 startup_task_runner_->AddTask(create_threads); |
| 776 | 779 |
| 777 StartupTask browser_thread_started = base::Bind( | 780 StartupTask browser_thread_started = base::Bind( |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 812 ui_message_loop_options.message_loop_type = base::MessageLoop::TYPE_UI; | 815 ui_message_loop_options.message_loop_type = base::MessageLoop::TYPE_UI; |
| 813 | 816 |
| 814 // Start threads in the order they occur in the BrowserThread::ID | 817 // Start threads in the order they occur in the BrowserThread::ID |
| 815 // enumeration, except for BrowserThread::UI which is the main | 818 // enumeration, except for BrowserThread::UI which is the main |
| 816 // thread. | 819 // thread. |
| 817 // | 820 // |
| 818 // Must be size_t so we can increment it. | 821 // Must be size_t so we can increment it. |
| 819 for (size_t thread_id = BrowserThread::UI + 1; | 822 for (size_t thread_id = BrowserThread::UI + 1; |
| 820 thread_id < BrowserThread::ID_COUNT; | 823 thread_id < BrowserThread::ID_COUNT; |
| 821 ++thread_id) { | 824 ++thread_id) { |
| 822 scoped_ptr<BrowserProcessSubThread>* thread_to_start = NULL; | 825 std::unique_ptr<BrowserProcessSubThread>* thread_to_start = NULL; |
| 823 base::Thread::Options options; | 826 base::Thread::Options options; |
| 824 | 827 |
| 825 switch (thread_id) { | 828 switch (thread_id) { |
| 826 case BrowserThread::DB: | 829 case BrowserThread::DB: |
| 827 TRACE_EVENT_BEGIN1("startup", | 830 TRACE_EVENT_BEGIN1("startup", |
| 828 "BrowserMainLoop::CreateThreads:start", | 831 "BrowserMainLoop::CreateThreads:start", |
| 829 "Thread", "BrowserThread::DB"); | 832 "Thread", "BrowserThread::DB"); |
| 830 thread_to_start = &db_thread_; | 833 thread_to_start = &db_thread_; |
| 831 options.timer_slack = base::TIMER_SLACK_MAXIMUM; | 834 options.timer_slack = base::TIMER_SLACK_MAXIMUM; |
| 832 break; | 835 break; |
| (...skipping 614 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1447 DCHECK(is_tracing_startup_for_duration_); | 1450 DCHECK(is_tracing_startup_for_duration_); |
| 1448 | 1451 |
| 1449 is_tracing_startup_for_duration_ = false; | 1452 is_tracing_startup_for_duration_ = false; |
| 1450 TracingController::GetInstance()->StopTracing( | 1453 TracingController::GetInstance()->StopTracing( |
| 1451 TracingController::CreateFileSink( | 1454 TracingController::CreateFileSink( |
| 1452 startup_trace_file_, | 1455 startup_trace_file_, |
| 1453 base::Bind(OnStoppedStartupTracing, startup_trace_file_))); | 1456 base::Bind(OnStoppedStartupTracing, startup_trace_file_))); |
| 1454 } | 1457 } |
| 1455 | 1458 |
| 1456 } // namespace content | 1459 } // namespace content |
| OLD | NEW |