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

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

Issue 2464233002: Experiment with redirecting all BrowserThreads (but UI/IO) to TaskScheduler (Closed)
Patch Set: remove WaitUntilThreadStarted on Android, makes Android test instrumentation hang, is previous issu… 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
« no previous file with comments | « content/browser/browser_main_loop.h ('k') | content/browser/browser_thread_impl.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 12 matching lines...) Expand all
23 #include "base/metrics/histogram_macros.h" 23 #include "base/metrics/histogram_macros.h"
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/synchronization/waitable_event.h"
33 #include "base/system_monitor/system_monitor.h" 34 #include "base/system_monitor/system_monitor.h"
34 #include "base/task_scheduler/initialization_util.h" 35 #include "base/task_scheduler/initialization_util.h"
36 #include "base/task_scheduler/post_task.h"
35 #include "base/task_scheduler/scheduler_worker_pool_params.h" 37 #include "base/task_scheduler/scheduler_worker_pool_params.h"
36 #include "base/task_scheduler/task_scheduler.h" 38 #include "base/task_scheduler/task_scheduler.h"
37 #include "base/task_scheduler/task_traits.h" 39 #include "base/task_scheduler/task_traits.h"
38 #include "base/threading/sequenced_worker_pool.h" 40 #include "base/threading/sequenced_worker_pool.h"
39 #include "base/threading/thread_restrictions.h" 41 #include "base/threading/thread_restrictions.h"
40 #include "base/threading/thread_task_runner_handle.h" 42 #include "base/threading/thread_task_runner_handle.h"
41 #include "base/time/time.h" 43 #include "base/time/time.h"
42 #include "base/timer/hi_res_timer_manager.h" 44 #include "base/timer/hi_res_timer_manager.h"
43 #include "base/trace_event/memory_dump_manager.h" 45 #include "base/trace_event/memory_dump_manager.h"
44 #include "base/trace_event/trace_event.h" 46 #include "base/trace_event/trace_event.h"
(...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after
302 304
303 // Disable optimizations for this block of functions so the compiler doesn't 305 // Disable optimizations for this block of functions so the compiler doesn't
304 // merge them all together. This makes it possible to tell what thread was 306 // merge them all together. This makes it possible to tell what thread was
305 // unresponsive by inspecting the callstack. 307 // unresponsive by inspecting the callstack.
306 MSVC_DISABLE_OPTIMIZE() 308 MSVC_DISABLE_OPTIMIZE()
307 MSVC_PUSH_DISABLE_WARNING(4748) 309 MSVC_PUSH_DISABLE_WARNING(4748)
308 310
309 NOINLINE void ResetThread_DB(std::unique_ptr<BrowserProcessSubThread> thread) { 311 NOINLINE void ResetThread_DB(std::unique_ptr<BrowserProcessSubThread> thread) {
310 volatile int inhibit_comdat = __LINE__; 312 volatile int inhibit_comdat = __LINE__;
311 ALLOW_UNUSED_LOCAL(inhibit_comdat); 313 ALLOW_UNUSED_LOCAL(inhibit_comdat);
312 thread.reset(); 314 if (thread) {
315 thread.reset();
316 } else {
317 BrowserThreadImpl::StopRedirectionOfThreadID(BrowserThread::DB);
318 }
313 } 319 }
314 320
315 NOINLINE void ResetThread_FILE( 321 NOINLINE void ResetThread_FILE(
316 std::unique_ptr<BrowserProcessSubThread> thread) { 322 std::unique_ptr<BrowserProcessSubThread> thread) {
317 volatile int inhibit_comdat = __LINE__; 323 volatile int inhibit_comdat = __LINE__;
318 ALLOW_UNUSED_LOCAL(inhibit_comdat); 324 ALLOW_UNUSED_LOCAL(inhibit_comdat);
319 thread.reset(); 325 if (thread) {
326 thread.reset();
327 } else {
328 BrowserThreadImpl::StopRedirectionOfThreadID(BrowserThread::FILE);
329 }
320 } 330 }
321 331
322 NOINLINE void ResetThread_FILE_USER_BLOCKING( 332 NOINLINE void ResetThread_FILE_USER_BLOCKING(
323 std::unique_ptr<BrowserProcessSubThread> thread) { 333 std::unique_ptr<BrowserProcessSubThread> thread) {
324 volatile int inhibit_comdat = __LINE__; 334 volatile int inhibit_comdat = __LINE__;
325 ALLOW_UNUSED_LOCAL(inhibit_comdat); 335 ALLOW_UNUSED_LOCAL(inhibit_comdat);
326 thread.reset(); 336 if (thread) {
337 thread.reset();
338 } else {
339 BrowserThreadImpl::StopRedirectionOfThreadID(
340 BrowserThread::FILE_USER_BLOCKING);
341 }
327 } 342 }
328 343
329 NOINLINE void ResetThread_PROCESS_LAUNCHER( 344 NOINLINE void ResetThread_PROCESS_LAUNCHER(
330 std::unique_ptr<BrowserProcessSubThread> thread) { 345 std::unique_ptr<BrowserProcessSubThread> thread) {
331 volatile int inhibit_comdat = __LINE__; 346 volatile int inhibit_comdat = __LINE__;
332 ALLOW_UNUSED_LOCAL(inhibit_comdat); 347 ALLOW_UNUSED_LOCAL(inhibit_comdat);
333 thread.reset(); 348 if (thread) {
349 thread.reset();
350 } else {
351 BrowserThreadImpl::StopRedirectionOfThreadID(
352 BrowserThread::PROCESS_LAUNCHER);
353 }
334 } 354 }
335 355
336 NOINLINE void ResetThread_CACHE( 356 NOINLINE void ResetThread_CACHE(
337 std::unique_ptr<BrowserProcessSubThread> thread) { 357 std::unique_ptr<BrowserProcessSubThread> thread) {
338 volatile int inhibit_comdat = __LINE__; 358 volatile int inhibit_comdat = __LINE__;
339 ALLOW_UNUSED_LOCAL(inhibit_comdat); 359 ALLOW_UNUSED_LOCAL(inhibit_comdat);
340 thread.reset(); 360 if (thread) {
361 thread.reset();
362 } else {
363 BrowserThreadImpl::StopRedirectionOfThreadID(BrowserThread::CACHE);
364 }
341 } 365 }
342 366
343 NOINLINE void ResetThread_IO(std::unique_ptr<BrowserProcessSubThread> thread) { 367 NOINLINE void ResetThread_IO(std::unique_ptr<BrowserProcessSubThread> thread) {
344 volatile int inhibit_comdat = __LINE__; 368 volatile int inhibit_comdat = __LINE__;
345 ALLOW_UNUSED_LOCAL(inhibit_comdat); 369 ALLOW_UNUSED_LOCAL(inhibit_comdat);
346 thread.reset(); 370 thread.reset();
347 } 371 }
348 372
349 NOINLINE void ResetThread_IndexedDb(std::unique_ptr<base::Thread> thread) { 373 NOINLINE void ResetThread_IndexedDb(std::unique_ptr<base::Thread> thread) {
350 volatile int inhibit_comdat = __LINE__; 374 volatile int inhibit_comdat = __LINE__;
(...skipping 605 matching lines...) Expand 10 before | Expand all | Expand 10 after
956 base::TaskScheduler::CreateAndSetDefaultTaskScheduler( 980 base::TaskScheduler::CreateAndSetDefaultTaskScheduler(
957 params_vector, index_to_traits_callback); 981 params_vector, index_to_traits_callback);
958 982
959 GetContentClient()->browser()->PerformExperimentalTaskSchedulerRedirections(); 983 GetContentClient()->browser()->PerformExperimentalTaskSchedulerRedirections();
960 984
961 base::Thread::Options io_message_loop_options; 985 base::Thread::Options io_message_loop_options;
962 io_message_loop_options.message_loop_type = base::MessageLoop::TYPE_IO; 986 io_message_loop_options.message_loop_type = base::MessageLoop::TYPE_IO;
963 base::Thread::Options ui_message_loop_options; 987 base::Thread::Options ui_message_loop_options;
964 ui_message_loop_options.message_loop_type = base::MessageLoop::TYPE_UI; 988 ui_message_loop_options.message_loop_type = base::MessageLoop::TYPE_UI;
965 989
966 // Start threads in the order they occur in the BrowserThread::ID 990 const bool redirect_nonUInonIO_browser_threads =
967 // enumeration, except for BrowserThread::UI which is the main 991 GetContentClient()
968 // thread. 992 ->browser()
993 ->RedirectNonUINonIOBrowserThreadsToTaskScheduler();
994
995 // Start threads in the order they occur in the BrowserThread::ID enumeration,
996 // except for BrowserThread::UI which is the main thread.
969 // 997 //
970 // Must be size_t so we can increment it. 998 // Must be size_t so we can increment it.
971 for (size_t thread_id = BrowserThread::UI + 1; 999 for (size_t thread_id = BrowserThread::UI + 1;
972 thread_id < BrowserThread::ID_COUNT; 1000 thread_id < BrowserThread::ID_COUNT;
973 ++thread_id) { 1001 ++thread_id) {
974 std::unique_ptr<BrowserProcessSubThread>* thread_to_start = NULL; 1002 // If this thread ID is backed by a real thread, |thread_to_start| will be
1003 // set to the appropriate BrowserProcessSubThread*. And |options| can be
1004 // updated away from its default.
1005 std::unique_ptr<BrowserProcessSubThread>* thread_to_start = nullptr;
975 base::Thread::Options options; 1006 base::Thread::Options options;
976 1007
1008 // Otherwise this thread ID will be backed by a SingleThreadTaskRunner using
1009 // |non_ui_non_io_task_runner_traits| (which can be augmented below).
1010 // TODO(gab): Existing non-UI/non-IO BrowserThreads allow waiting so the
1011 // initial redirection will as well but they probably don't need to.
1012 base::TaskTraits non_ui_non_io_task_runner_traits =
1013 base::TaskTraits().WithFileIO().WithWait();
1014
977 switch (thread_id) { 1015 switch (thread_id) {
978 case BrowserThread::DB: 1016 case BrowserThread::DB:
979 TRACE_EVENT_BEGIN1("startup", 1017 TRACE_EVENT_BEGIN1("startup",
980 "BrowserMainLoop::CreateThreads:start", 1018 "BrowserMainLoop::CreateThreads:start",
981 "Thread", "BrowserThread::DB"); 1019 "Thread", "BrowserThread::DB");
982 thread_to_start = &db_thread_; 1020 if (redirect_nonUInonIO_browser_threads) {
983 options.timer_slack = base::TIMER_SLACK_MAXIMUM; 1021 non_ui_non_io_task_runner_traits
1022 .WithPriority(base::TaskPriority::USER_VISIBLE)
1023 .WithShutdownBehavior(base::TaskShutdownBehavior::BLOCK_SHUTDOWN);
1024 } else {
1025 thread_to_start = &db_thread_;
1026 options.timer_slack = base::TIMER_SLACK_MAXIMUM;
1027 }
984 break; 1028 break;
985 case BrowserThread::FILE_USER_BLOCKING: 1029 case BrowserThread::FILE_USER_BLOCKING:
986 TRACE_EVENT_BEGIN1("startup", 1030 TRACE_EVENT_BEGIN1("startup",
987 "BrowserMainLoop::CreateThreads:start", 1031 "BrowserMainLoop::CreateThreads:start",
988 "Thread", "BrowserThread::FILE_USER_BLOCKING"); 1032 "Thread", "BrowserThread::FILE_USER_BLOCKING");
989 thread_to_start = &file_user_blocking_thread_; 1033 if (redirect_nonUInonIO_browser_threads) {
1034 non_ui_non_io_task_runner_traits
1035 .WithPriority(base::TaskPriority::USER_BLOCKING)
1036 .WithShutdownBehavior(base::TaskShutdownBehavior::BLOCK_SHUTDOWN);
1037 } else {
1038 thread_to_start = &file_user_blocking_thread_;
1039 }
990 break; 1040 break;
991 case BrowserThread::FILE: 1041 case BrowserThread::FILE:
992 TRACE_EVENT_BEGIN1("startup", 1042 TRACE_EVENT_BEGIN1("startup",
993 "BrowserMainLoop::CreateThreads:start", 1043 "BrowserMainLoop::CreateThreads:start",
994 "Thread", "BrowserThread::FILE"); 1044 "Thread", "BrowserThread::FILE");
1045
1046 #if defined(OS_WIN)
1047 // On Windows, the FILE thread needs to have a UI message loop which
1048 // pumps messages in such a way that Google Update can communicate back
1049 // to us.
1050 // TODO(robliao): Need to support COM in TaskScheduler before
1051 // redirecting the FILE thread on Windows. http://crbug.com/662122
995 thread_to_start = &file_thread_; 1052 thread_to_start = &file_thread_;
996 #if defined(OS_WIN)
997 // On Windows, the FILE thread needs to be have a UI message loop
998 // which pumps messages in such a way that Google Update can
999 // communicate back to us.
1000 options = ui_message_loop_options; 1053 options = ui_message_loop_options;
1001 #else 1054 #else
1002 options = io_message_loop_options; 1055 if (redirect_nonUInonIO_browser_threads) {
1056 non_ui_non_io_task_runner_traits
1057 .WithPriority(base::TaskPriority::BACKGROUND)
1058 .WithShutdownBehavior(base::TaskShutdownBehavior::BLOCK_SHUTDOWN);
1059 } else {
1060 thread_to_start = &file_thread_;
1061 options = io_message_loop_options;
1062 options.timer_slack = base::TIMER_SLACK_MAXIMUM;
1063 }
1003 #endif 1064 #endif
1004 options.timer_slack = base::TIMER_SLACK_MAXIMUM;
1005 break; 1065 break;
1006 case BrowserThread::PROCESS_LAUNCHER: 1066 case BrowserThread::PROCESS_LAUNCHER:
1007 TRACE_EVENT_BEGIN1("startup", 1067 TRACE_EVENT_BEGIN1("startup",
1008 "BrowserMainLoop::CreateThreads:start", 1068 "BrowserMainLoop::CreateThreads:start",
1009 "Thread", "BrowserThread::PROCESS_LAUNCHER"); 1069 "Thread", "BrowserThread::PROCESS_LAUNCHER");
1010 thread_to_start = &process_launcher_thread_; 1070 if (redirect_nonUInonIO_browser_threads) {
1011 options.timer_slack = base::TIMER_SLACK_MAXIMUM; 1071 non_ui_non_io_task_runner_traits
1072 .WithPriority(base::TaskPriority::USER_BLOCKING)
1073 .WithShutdownBehavior(base::TaskShutdownBehavior::BLOCK_SHUTDOWN);
1074 } else {
1075 thread_to_start = &process_launcher_thread_;
1076 options.timer_slack = base::TIMER_SLACK_MAXIMUM;
1077 }
1012 break; 1078 break;
1013 case BrowserThread::CACHE: 1079 case BrowserThread::CACHE:
1014 TRACE_EVENT_BEGIN1("startup", 1080 TRACE_EVENT_BEGIN1("startup",
1015 "BrowserMainLoop::CreateThreads:start", 1081 "BrowserMainLoop::CreateThreads:start",
1016 "Thread", "BrowserThread::CACHE"); 1082 "Thread", "BrowserThread::CACHE");
1083 #if defined(OS_WIN)
1084 // TaskScheduler doesn't support async I/O on Windows as CACHE thread is
1085 // the only user and this use case is going away in
1086 // https://codereview.chromium.org/2216583003/.
1087 // TODO(gavinp): Remove this ifdef (and thus enable redirection of the
1088 // CACHE thread on Windows) once that CL lands.
1017 thread_to_start = &cache_thread_; 1089 thread_to_start = &cache_thread_;
1018 #if defined(OS_WIN)
1019 options = io_message_loop_options; 1090 options = io_message_loop_options;
1020 #endif // defined(OS_WIN)
1021 options.timer_slack = base::TIMER_SLACK_MAXIMUM; 1091 options.timer_slack = base::TIMER_SLACK_MAXIMUM;
1092 #else // OS_WIN
1093 if (redirect_nonUInonIO_browser_threads) {
1094 non_ui_non_io_task_runner_traits
1095 .WithPriority(base::TaskPriority::USER_BLOCKING)
1096 .WithShutdownBehavior(base::TaskShutdownBehavior::BLOCK_SHUTDOWN);
1097 } else {
1098 thread_to_start = &cache_thread_;
1099 options.timer_slack = base::TIMER_SLACK_MAXIMUM;
1100 }
1101 #endif // OS_WIN
1022 break; 1102 break;
1023 case BrowserThread::IO: 1103 case BrowserThread::IO:
1024 TRACE_EVENT_BEGIN1("startup", 1104 TRACE_EVENT_BEGIN1("startup",
1025 "BrowserMainLoop::CreateThreads:start", 1105 "BrowserMainLoop::CreateThreads:start",
1026 "Thread", "BrowserThread::IO"); 1106 "Thread", "BrowserThread::IO");
1027 thread_to_start = &io_thread_; 1107 thread_to_start = &io_thread_;
1028 options = io_message_loop_options; 1108 options = io_message_loop_options;
1029 #if defined(OS_ANDROID) || defined(OS_CHROMEOS) 1109 #if defined(OS_ANDROID) || defined(OS_CHROMEOS)
1030 // Up the priority of the |io_thread_| as some of its IPCs relate to 1110 // Up the priority of the |io_thread_| as some of its IPCs relate to
1031 // display tasks. 1111 // display tasks.
1032 options.priority = base::ThreadPriority::DISPLAY; 1112 options.priority = base::ThreadPriority::DISPLAY;
1033 #endif 1113 #endif
1034 break; 1114 break;
1035 case BrowserThread::UI: 1115 case BrowserThread::UI: // Falls through.
1036 case BrowserThread::ID_COUNT: 1116 case BrowserThread::ID_COUNT: // Falls through.
1037 default:
1038 NOTREACHED(); 1117 NOTREACHED();
1039 break; 1118 break;
1040 } 1119 }
1041 1120
1042 BrowserThread::ID id = static_cast<BrowserThread::ID>(thread_id); 1121 BrowserThread::ID id = static_cast<BrowserThread::ID>(thread_id);
1043 1122
1044 if (thread_to_start) { 1123 if (thread_to_start) {
1045 (*thread_to_start).reset(new BrowserProcessSubThread(id)); 1124 (*thread_to_start).reset(new BrowserProcessSubThread(id));
1046 if (!(*thread_to_start)->StartWithOptions(options)) { 1125 if (!(*thread_to_start)->StartWithOptions(options))
1047 LOG(FATAL) << "Failed to start the browser thread: id == " << id; 1126 LOG(FATAL) << "Failed to start the browser thread: id == " << id;
1048 }
1049 } else { 1127 } else {
1050 NOTREACHED(); 1128 scoped_refptr<base::SingleThreadTaskRunner> redirection_task_runner =
1129 base::CreateSingleThreadTaskRunnerWithTraits(
1130 non_ui_non_io_task_runner_traits);
1131 DCHECK(redirection_task_runner);
1132 BrowserThreadImpl::RedirectThreadIDToTaskRunner(
1133 id, std::move(redirection_task_runner));
1051 } 1134 }
1052 1135
1053 TRACE_EVENT_END0("startup", "BrowserMainLoop::CreateThreads:start"); 1136 TRACE_EVENT_END0("startup", "BrowserMainLoop::CreateThreads:start");
1054 } 1137 }
1055 created_threads_ = true; 1138 created_threads_ = true;
1056 return result_code_; 1139 return result_code_;
1057 } 1140 }
1058 1141
1059 int BrowserMainLoop::PreMainMessageLoopRun() { 1142 int BrowserMainLoop::PreMainMessageLoopRun() {
1060 #if defined(OS_ANDROID) 1143 #if defined(OS_ANDROID)
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
1196 // 1279 //
1197 // - (Not sure why DB stops last.) 1280 // - (Not sure why DB stops last.)
1198 switch (thread_id) { 1281 switch (thread_id) {
1199 case BrowserThread::DB: { 1282 case BrowserThread::DB: {
1200 TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:DBThread"); 1283 TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:DBThread");
1201 ResetThread_DB(std::move(db_thread_)); 1284 ResetThread_DB(std::move(db_thread_));
1202 break; 1285 break;
1203 } 1286 }
1204 case BrowserThread::FILE: { 1287 case BrowserThread::FILE: {
1205 TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:FileThread"); 1288 TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:FileThread");
1206 // Clean up state that lives on or uses the file_thread_ before 1289 // Clean up state that lives on or uses the FILE thread before it goes
1207 // it goes away. 1290 // away.
1208 save_file_manager_->Shutdown(); 1291 save_file_manager_->Shutdown();
1209 ResetThread_FILE(std::move(file_thread_)); 1292 ResetThread_FILE(std::move(file_thread_));
1210 break; 1293 break;
1211 } 1294 }
1212 case BrowserThread::FILE_USER_BLOCKING: { 1295 case BrowserThread::FILE_USER_BLOCKING: {
1213 TRACE_EVENT0("shutdown", 1296 TRACE_EVENT0("shutdown",
1214 "BrowserMainLoop::Subsystem:FileUserBlockingThread"); 1297 "BrowserMainLoop::Subsystem:FileUserBlockingThread");
1215 ResetThread_FILE_USER_BLOCKING(std::move(file_user_blocking_thread_)); 1298 ResetThread_FILE_USER_BLOCKING(std::move(file_user_blocking_thread_));
1216 break; 1299 break;
1217 } 1300 }
1218 case BrowserThread::PROCESS_LAUNCHER: { 1301 case BrowserThread::PROCESS_LAUNCHER: {
1219 TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:LauncherThread"); 1302 TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:LauncherThread");
1220 ResetThread_PROCESS_LAUNCHER(std::move(process_launcher_thread_)); 1303 ResetThread_PROCESS_LAUNCHER(std::move(process_launcher_thread_));
1221 break; 1304 break;
1222 } 1305 }
1223 case BrowserThread::CACHE: { 1306 case BrowserThread::CACHE: {
1224 TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:CacheThread"); 1307 TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:CacheThread");
1225 ResetThread_CACHE(std::move(cache_thread_)); 1308 ResetThread_CACHE(std::move(cache_thread_));
1226 break; 1309 break;
1227 } 1310 }
1228 case BrowserThread::IO: { 1311 case BrowserThread::IO: {
1229 TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:IOThread"); 1312 TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:IOThread");
1230 ResetThread_IO(std::move(io_thread_)); 1313 ResetThread_IO(std::move(io_thread_));
1231 break; 1314 break;
1232 } 1315 }
1233 case BrowserThread::UI: 1316 case BrowserThread::UI:
1234 case BrowserThread::ID_COUNT: 1317 case BrowserThread::ID_COUNT:
1235 default:
1236 NOTREACHED(); 1318 NOTREACHED();
1237 break; 1319 break;
1238 } 1320 }
1239 } 1321 }
1240 { 1322 {
1241 TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:IndexedDBThread"); 1323 TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:IndexedDBThread");
1242 ResetThread_IndexedDb(std::move(indexed_db_thread_)); 1324 ResetThread_IndexedDb(std::move(indexed_db_thread_));
1243 } 1325 }
1244 1326
1245 // Close the blocking I/O pool after the other threads. Other threads such 1327 // Close the blocking I/O pool after the other threads. Other threads such
(...skipping 461 matching lines...) Expand 10 before | Expand all | Expand 10 after
1707 if (!audio_manager_) { 1789 if (!audio_manager_) {
1708 audio_thread_ = base::MakeUnique<AudioManagerThread>(); 1790 audio_thread_ = base::MakeUnique<AudioManagerThread>();
1709 audio_manager_ = media::AudioManager::Create( 1791 audio_manager_ = media::AudioManager::Create(
1710 audio_thread_->task_runner(), audio_thread_->worker_task_runner(), 1792 audio_thread_->task_runner(), audio_thread_->worker_task_runner(),
1711 MediaInternals::GetInstance()); 1793 MediaInternals::GetInstance());
1712 } 1794 }
1713 CHECK(audio_manager_); 1795 CHECK(audio_manager_);
1714 } 1796 }
1715 1797
1716 } // namespace content 1798 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/browser_main_loop.h ('k') | content/browser/browser_thread_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698