Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(469)

Side by Side Diff: content/browser/browser_main_loop.cc

Issue 2539263003: Move Task Scheduler Initialization From chrome/browser to Content (Closed)
Patch Set: Rebase to bf8e2f1 Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
9 #include <string> 9 #include <string>
10 #include <utility> 10 #include <utility>
(...skipping 13 matching lines...) Expand all
24 #include "base/metrics/user_metrics.h" 24 #include "base/metrics/user_metrics.h"
25 #include "base/pending_task.h" 25 #include "base/pending_task.h"
26 #include "base/power_monitor/power_monitor.h" 26 #include "base/power_monitor/power_monitor.h"
27 #include "base/power_monitor/power_monitor_device_source.h" 27 #include "base/power_monitor/power_monitor_device_source.h"
28 #include "base/process/process_metrics.h" 28 #include "base/process/process_metrics.h"
29 #include "base/run_loop.h" 29 #include "base/run_loop.h"
30 #include "base/single_thread_task_runner.h" 30 #include "base/single_thread_task_runner.h"
31 #include "base/strings/string_number_conversions.h" 31 #include "base/strings/string_number_conversions.h"
32 #include "base/strings/string_split.h" 32 #include "base/strings/string_split.h"
33 #include "base/system_monitor/system_monitor.h" 33 #include "base/system_monitor/system_monitor.h"
34 #include "base/task_scheduler/initialization_util.h"
35 #include "base/task_scheduler/scheduler_worker_pool_params.h"
36 #include "base/task_scheduler/task_scheduler.h"
37 #include "base/task_scheduler/task_traits.h"
34 #include "base/threading/sequenced_worker_pool.h" 38 #include "base/threading/sequenced_worker_pool.h"
35 #include "base/threading/thread_restrictions.h" 39 #include "base/threading/thread_restrictions.h"
36 #include "base/threading/thread_task_runner_handle.h" 40 #include "base/threading/thread_task_runner_handle.h"
41 #include "base/time/time.h"
37 #include "base/timer/hi_res_timer_manager.h" 42 #include "base/timer/hi_res_timer_manager.h"
38 #include "base/trace_event/memory_dump_manager.h" 43 #include "base/trace_event/memory_dump_manager.h"
39 #include "base/trace_event/trace_event.h" 44 #include "base/trace_event/trace_event.h"
40 #include "build/build_config.h" 45 #include "build/build_config.h"
41 #include "components/discardable_memory/service/discardable_shared_memory_manage r.h" 46 #include "components/discardable_memory/service/discardable_shared_memory_manage r.h"
42 #include "components/tracing/browser/trace_config_file.h" 47 #include "components/tracing/browser/trace_config_file.h"
43 #include "components/tracing/common/process_metrics_memory_dump_provider.h" 48 #include "components/tracing/common/process_metrics_memory_dump_provider.h"
44 #include "components/tracing/common/trace_to_console.h" 49 #include "components/tracing/common/trace_to_console.h"
45 #include "components/tracing/common/tracing_switches.h" 50 #include "components/tracing/common/tracing_switches.h"
46 #include "content/browser/audio_device_thread.h" 51 #include "content/browser/audio_device_thread.h"
(...skipping 321 matching lines...) Expand 10 before | Expand all | Expand 10 after
368 critical_threshold_mb >= 0) { 373 critical_threshold_mb >= 0) {
369 return base::MakeUnique<base::win::MemoryPressureMonitor>( 374 return base::MakeUnique<base::win::MemoryPressureMonitor>(
370 moderate_threshold_mb, critical_threshold_mb); 375 moderate_threshold_mb, critical_threshold_mb);
371 } 376 }
372 377
373 // In absence of valid switches use the automatic defaults. 378 // In absence of valid switches use the automatic defaults.
374 return base::MakeUnique<base::win::MemoryPressureMonitor>(); 379 return base::MakeUnique<base::win::MemoryPressureMonitor>();
375 } 380 }
376 #endif // defined(OS_WIN) 381 #endif // defined(OS_WIN)
377 382
383 enum WorkerPoolType : size_t {
384 BACKGROUND = 0,
385 BACKGROUND_FILE_IO,
386 FOREGROUND,
387 FOREGROUND_FILE_IO,
388 WORKER_POOL_COUNT // Always last.
389 };
390
391 std::vector<base::SchedulerWorkerPoolParams>
392 GetDefaultSchedulerWorkerPoolParams() {
393 using StandbyThreadPolicy =
394 base::SchedulerWorkerPoolParams::StandbyThreadPolicy;
395 using ThreadPriority = base::ThreadPriority;
396 std::vector<base::SchedulerWorkerPoolParams> params_vector;
397 #if defined(OS_ANDROID)
398 params_vector.emplace_back(
399 "Background", ThreadPriority::BACKGROUND, StandbyThreadPolicy::ONE,
400 base::RecommendedMaxNumberOfThreadsInPool(2, 8, 0.1, 0),
401 base::TimeDelta::FromSeconds(30));
402 params_vector.emplace_back(
403 "BackgroundFileIO", ThreadPriority::BACKGROUND, StandbyThreadPolicy::ONE,
404 base::RecommendedMaxNumberOfThreadsInPool(2, 8, 0.1, 0),
405 base::TimeDelta::FromSeconds(30));
406 params_vector.emplace_back(
407 "Foreground", ThreadPriority::NORMAL, StandbyThreadPolicy::ONE,
408 base::RecommendedMaxNumberOfThreadsInPool(3, 8, 0.3, 0),
409 base::TimeDelta::FromSeconds(30));
410 params_vector.emplace_back(
411 "ForegroundFileIO", ThreadPriority::NORMAL, StandbyThreadPolicy::ONE,
412 base::RecommendedMaxNumberOfThreadsInPool(3, 8, 0.1, 0),
413 base::TimeDelta::FromSeconds(30));
414 #else
415 params_vector.emplace_back(
416 "Background", ThreadPriority::BACKGROUND, StandbyThreadPolicy::ONE,
417 base::RecommendedMaxNumberOfThreadsInPool(3, 8, 0.1, 0),
418 base::TimeDelta::FromSeconds(30));
419 params_vector.emplace_back(
420 "BackgroundFileIO", ThreadPriority::BACKGROUND, StandbyThreadPolicy::ONE,
421 base::RecommendedMaxNumberOfThreadsInPool(3, 8, 0.1, 0),
422 base::TimeDelta::FromSeconds(30));
423 params_vector.emplace_back(
424 "Foreground", ThreadPriority::NORMAL, StandbyThreadPolicy::ONE,
425 base::RecommendedMaxNumberOfThreadsInPool(8, 32, 0.3, 0),
426 base::TimeDelta::FromSeconds(30));
427 params_vector.emplace_back(
428 "ForegroundFileIO", ThreadPriority::NORMAL, StandbyThreadPolicy::ONE,
429 base::RecommendedMaxNumberOfThreadsInPool(8, 32, 0.3, 0),
430 base::TimeDelta::FromSeconds(30));
431 #endif
432 DCHECK_EQ(WORKER_POOL_COUNT, params_vector.size());
433 return params_vector;
434 }
435
436 // Returns the worker pool index for |traits| defaulting to FOREGROUND or
437 // FOREGROUND_FILE_IO on any other priorities based off of worker pools defined
438 // in GetDefaultSchedulerWorkerPoolParams().
439 size_t DefaultBrowserWorkerPoolIndexForTraits(const base::TaskTraits& traits) {
440 const bool is_background =
441 traits.priority() == base::TaskPriority::BACKGROUND;
442 if (traits.with_file_io())
443 return is_background ? BACKGROUND_FILE_IO : FOREGROUND_FILE_IO;
444
445 return is_background ? BACKGROUND : FOREGROUND;
446 }
447
378 } // namespace 448 } // namespace
379 449
380 #if defined(USE_X11) && !defined(OS_CHROMEOS) 450 #if defined(USE_X11) && !defined(OS_CHROMEOS)
381 namespace internal { 451 namespace internal {
382 452
383 // Forwards GPUInfo updates to ui::XVisualManager 453 // Forwards GPUInfo updates to ui::XVisualManager
384 class GpuDataManagerVisualProxy : public GpuDataManagerObserver { 454 class GpuDataManagerVisualProxy : public GpuDataManagerObserver {
385 public: 455 public:
386 explicit GpuDataManagerVisualProxy(GpuDataManagerImpl* gpu_data_manager) 456 explicit GpuDataManagerVisualProxy(GpuDataManagerImpl* gpu_data_manager)
387 : gpu_data_manager_(gpu_data_manager) { 457 : gpu_data_manager_(gpu_data_manager) {
(...skipping 473 matching lines...) Expand 10 before | Expand all | Expand 10 after
861 startup_task_runner_->RunAllTasksNow(); 931 startup_task_runner_->RunAllTasksNow();
862 } 932 }
863 #else 933 #else
864 startup_task_runner_->RunAllTasksNow(); 934 startup_task_runner_->RunAllTasksNow();
865 #endif 935 #endif
866 } 936 }
867 937
868 int BrowserMainLoop::CreateThreads() { 938 int BrowserMainLoop::CreateThreads() {
869 TRACE_EVENT0("startup,rail", "BrowserMainLoop::CreateThreads"); 939 TRACE_EVENT0("startup,rail", "BrowserMainLoop::CreateThreads");
870 940
941 std::vector<base::SchedulerWorkerPoolParams> params_vector;
942 base::TaskScheduler::WorkerPoolIndexForTraitsCallback
943 index_to_traits_callback;
944 GetContentClient()->browser()->GetTaskSchedulerInitializationParams(
945 &params_vector, &index_to_traits_callback);
946
947 if (params_vector.empty() || index_to_traits_callback.is_null()) {
948 params_vector = GetDefaultSchedulerWorkerPoolParams();
949 index_to_traits_callback =
950 base::Bind(&DefaultBrowserWorkerPoolIndexForTraits);
951 }
952
953 base::TaskScheduler::CreateAndSetDefaultTaskScheduler(
954 params_vector, index_to_traits_callback);
955
956 GetContentClient()->browser()->PerformExperimentalTaskSchedulerRedirections();
957
871 base::Thread::Options io_message_loop_options; 958 base::Thread::Options io_message_loop_options;
872 io_message_loop_options.message_loop_type = base::MessageLoop::TYPE_IO; 959 io_message_loop_options.message_loop_type = base::MessageLoop::TYPE_IO;
873 base::Thread::Options ui_message_loop_options; 960 base::Thread::Options ui_message_loop_options;
874 ui_message_loop_options.message_loop_type = base::MessageLoop::TYPE_UI; 961 ui_message_loop_options.message_loop_type = base::MessageLoop::TYPE_UI;
875 962
876 // Start threads in the order they occur in the BrowserThread::ID 963 // Start threads in the order they occur in the BrowserThread::ID
877 // enumeration, except for BrowserThread::UI which is the main 964 // enumeration, except for BrowserThread::UI which is the main
878 // thread. 965 // thread.
879 // 966 //
880 // Must be size_t so we can increment it. 967 // Must be size_t so we can increment it.
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after
1155 // Close the blocking I/O pool after the other threads. Other threads such 1242 // Close the blocking I/O pool after the other threads. Other threads such
1156 // as the I/O thread may need to schedule work like closing files or flushing 1243 // as the I/O thread may need to schedule work like closing files or flushing
1157 // data during shutdown, so the blocking pool needs to be available. There 1244 // data during shutdown, so the blocking pool needs to be available. There
1158 // may also be slow operations pending that will blcok shutdown, so closing 1245 // may also be slow operations pending that will blcok shutdown, so closing
1159 // it here (which will block until required operations are complete) gives 1246 // it here (which will block until required operations are complete) gives
1160 // more head start for those operations to finish. 1247 // more head start for those operations to finish.
1161 { 1248 {
1162 TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:ThreadPool"); 1249 TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:ThreadPool");
1163 BrowserThreadImpl::ShutdownThreadPool(); 1250 BrowserThreadImpl::ShutdownThreadPool();
1164 } 1251 }
1252 {
1253 TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:TaskScheduler");
1254 base::TaskScheduler::GetInstance()->Shutdown();
1255 }
1256
1165 // Must happen after the IO thread is shutdown since this may be accessed from 1257 // Must happen after the IO thread is shutdown since this may be accessed from
1166 // it. 1258 // it.
1167 { 1259 {
1168 TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:GPUChannelFactory"); 1260 TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:GPUChannelFactory");
1169 if (BrowserGpuChannelHostFactory::instance()) { 1261 if (BrowserGpuChannelHostFactory::instance()) {
1170 #if defined(OS_ANDROID) 1262 #if defined(OS_ANDROID)
1171 // Clean up the references to the factory before terminating it. 1263 // Clean up the references to the factory before terminating it.
1172 ui::ContextProviderFactory::SetInstance(nullptr); 1264 ui::ContextProviderFactory::SetInstance(nullptr);
1173 ContextProviderFactoryImpl::Terminate(); 1265 ContextProviderFactoryImpl::Terminate();
1174 #endif 1266 #endif
(...skipping 434 matching lines...) Expand 10 before | Expand all | Expand 10 after
1609 if (!audio_manager_) { 1701 if (!audio_manager_) {
1610 audio_thread_ = base::MakeUnique<AudioDeviceThread>(); 1702 audio_thread_ = base::MakeUnique<AudioDeviceThread>();
1611 audio_manager_ = media::AudioManager::Create( 1703 audio_manager_ = media::AudioManager::Create(
1612 audio_thread_->GetTaskRunner(), audio_thread_->worker_task_runner(), 1704 audio_thread_->GetTaskRunner(), audio_thread_->worker_task_runner(),
1613 MediaInternals::GetInstance()); 1705 MediaInternals::GetInstance());
1614 } 1706 }
1615 CHECK(audio_manager_); 1707 CHECK(audio_manager_);
1616 } 1708 }
1617 1709
1618 } // namespace content 1710 } // namespace content
OLDNEW
« no previous file with comments | « components/task_scheduler_util/initialization_util.cc ('k') | content/public/browser/content_browser_client.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698