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

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: rm TODO 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 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"
35 #include "base/task_scheduler/post_task.h"
36 #include "base/task_scheduler/task_traits.h"
34 #include "base/threading/sequenced_worker_pool.h" 37 #include "base/threading/sequenced_worker_pool.h"
35 #include "base/threading/thread_restrictions.h" 38 #include "base/threading/thread_restrictions.h"
36 #include "base/threading/thread_task_runner_handle.h" 39 #include "base/threading/thread_task_runner_handle.h"
37 #include "base/timer/hi_res_timer_manager.h" 40 #include "base/timer/hi_res_timer_manager.h"
38 #include "base/trace_event/memory_dump_manager.h" 41 #include "base/trace_event/memory_dump_manager.h"
39 #include "base/trace_event/trace_event.h" 42 #include "base/trace_event/trace_event.h"
40 #include "build/build_config.h" 43 #include "build/build_config.h"
41 #include "components/discardable_memory/service/discardable_shared_memory_manage r.h" 44 #include "components/discardable_memory/service/discardable_shared_memory_manage r.h"
42 #include "components/tracing/browser/trace_config_file.h" 45 #include "components/tracing/browser/trace_config_file.h"
43 #include "components/tracing/common/process_metrics_memory_dump_provider.h" 46 #include "components/tracing/common/process_metrics_memory_dump_provider.h"
(...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after
294 void OnStoppedStartupTracing(const base::FilePath& trace_file) { 297 void OnStoppedStartupTracing(const base::FilePath& trace_file) {
295 VLOG(0) << "Completed startup tracing to " << trace_file.value(); 298 VLOG(0) << "Completed startup tracing to " << trace_file.value();
296 } 299 }
297 300
298 // Disable optimizations for this block of functions so the compiler doesn't 301 // Disable optimizations for this block of functions so the compiler doesn't
299 // merge them all together. This makes it possible to tell what thread was 302 // merge them all together. This makes it possible to tell what thread was
300 // unresponsive by inspecting the callstack. 303 // unresponsive by inspecting the callstack.
301 MSVC_DISABLE_OPTIMIZE() 304 MSVC_DISABLE_OPTIMIZE()
302 MSVC_PUSH_DISABLE_WARNING(4748) 305 MSVC_PUSH_DISABLE_WARNING(4748)
303 306
304 NOINLINE void ResetThread_DB(std::unique_ptr<BrowserProcessSubThread> thread) { 307 // Takes ownership of |task_runner| and blocks until it's empty.
308 void FlushThreadTaskRunner(
309 scoped_refptr<base::SingleThreadTaskRunner> task_runner) {
310 base::WaitableEvent thread_terminated(
311 base::WaitableEvent::ResetPolicy::MANUAL,
312 base::WaitableEvent::InitialState::NOT_SIGNALED);
313 task_runner->PostTask(FROM_HERE,
314 base::Bind(&base::WaitableEvent::Signal,
315 base::Unretained(&thread_terminated)));
316 thread_terminated.Wait();
317 }
318
319 NOINLINE void ResetThread_DB(
320 std::unique_ptr<BrowserProcessSubThread> thread,
321 scoped_refptr<base::SingleThreadTaskRunner> task_runner) {
322 DCHECK((thread && !task_runner) || (!thread && task_runner));
305 volatile int inhibit_comdat = __LINE__; 323 volatile int inhibit_comdat = __LINE__;
306 ALLOW_UNUSED_LOCAL(inhibit_comdat); 324 ALLOW_UNUSED_LOCAL(inhibit_comdat);
307 thread.reset(); 325 if (thread) {
326 thread.reset();
327 } else {
fdoray 2016/12/01 15:15:21 You could avoid keeping SingleThreadTaskRunners re
gab 2016/12/07 19:15:27 I was inspired by this and went a step further, th
328 BrowserThreadImpl::RedirectThreadIDToTaskRunner(BrowserThread::DB, nullptr);
fdoray 2016/12/01 15:15:21 Without redirection: 1. Main thread: ~BrowserProce
gab 2016/12/07 19:15:26 The thing is we have to change the state to SHUTDO
329 FlushThreadTaskRunner(std::move(task_runner));
330 }
308 } 331 }
309 332
310 NOINLINE void ResetThread_FILE( 333 NOINLINE void ResetThread_FILE(
311 std::unique_ptr<BrowserProcessSubThread> thread) { 334 std::unique_ptr<BrowserProcessSubThread> thread,
335 scoped_refptr<base::SingleThreadTaskRunner> task_runner) {
336 DCHECK((thread && !task_runner) || (!thread && task_runner));
312 volatile int inhibit_comdat = __LINE__; 337 volatile int inhibit_comdat = __LINE__;
313 ALLOW_UNUSED_LOCAL(inhibit_comdat); 338 ALLOW_UNUSED_LOCAL(inhibit_comdat);
314 thread.reset(); 339 if (thread) {
340 thread.reset();
341 } else {
342 BrowserThreadImpl::RedirectThreadIDToTaskRunner(BrowserThread::FILE,
343 nullptr);
344 FlushThreadTaskRunner(std::move(task_runner));
345 }
315 } 346 }
316 347
317 NOINLINE void ResetThread_FILE_USER_BLOCKING( 348 NOINLINE void ResetThread_FILE_USER_BLOCKING(
318 std::unique_ptr<BrowserProcessSubThread> thread) { 349 std::unique_ptr<BrowserProcessSubThread> thread,
350 scoped_refptr<base::SingleThreadTaskRunner> task_runner) {
351 DCHECK((thread && !task_runner) || (!thread && task_runner));
319 volatile int inhibit_comdat = __LINE__; 352 volatile int inhibit_comdat = __LINE__;
320 ALLOW_UNUSED_LOCAL(inhibit_comdat); 353 ALLOW_UNUSED_LOCAL(inhibit_comdat);
321 thread.reset(); 354 if (thread) {
355 thread.reset();
356 } else {
357 BrowserThreadImpl::RedirectThreadIDToTaskRunner(
358 BrowserThread::FILE_USER_BLOCKING, nullptr);
359 FlushThreadTaskRunner(std::move(task_runner));
360 }
322 } 361 }
323 362
324 NOINLINE void ResetThread_PROCESS_LAUNCHER( 363 NOINLINE void ResetThread_PROCESS_LAUNCHER(
325 std::unique_ptr<BrowserProcessSubThread> thread) { 364 std::unique_ptr<BrowserProcessSubThread> thread,
365 scoped_refptr<base::SingleThreadTaskRunner> task_runner) {
366 DCHECK((thread && !task_runner) || (!thread && task_runner));
326 volatile int inhibit_comdat = __LINE__; 367 volatile int inhibit_comdat = __LINE__;
327 ALLOW_UNUSED_LOCAL(inhibit_comdat); 368 ALLOW_UNUSED_LOCAL(inhibit_comdat);
328 thread.reset(); 369 if (thread) {
370 thread.reset();
371 } else {
372 BrowserThreadImpl::RedirectThreadIDToTaskRunner(
373 BrowserThread::PROCESS_LAUNCHER, nullptr);
374 FlushThreadTaskRunner(std::move(task_runner));
375 }
329 } 376 }
330 377
331 NOINLINE void ResetThread_CACHE( 378 NOINLINE void ResetThread_CACHE(
332 std::unique_ptr<BrowserProcessSubThread> thread) { 379 std::unique_ptr<BrowserProcessSubThread> thread,
380 scoped_refptr<base::SingleThreadTaskRunner> task_runner) {
381 DCHECK((thread && !task_runner) || (!thread && task_runner));
333 volatile int inhibit_comdat = __LINE__; 382 volatile int inhibit_comdat = __LINE__;
334 ALLOW_UNUSED_LOCAL(inhibit_comdat); 383 ALLOW_UNUSED_LOCAL(inhibit_comdat);
335 thread.reset(); 384 if (thread) {
385 thread.reset();
386 } else {
387 BrowserThreadImpl::RedirectThreadIDToTaskRunner(BrowserThread::CACHE,
388 nullptr);
389 FlushThreadTaskRunner(std::move(task_runner));
390 }
336 } 391 }
337 392
338 NOINLINE void ResetThread_IO(std::unique_ptr<BrowserProcessSubThread> thread) { 393 NOINLINE void ResetThread_IO(std::unique_ptr<BrowserProcessSubThread> thread) {
339 volatile int inhibit_comdat = __LINE__; 394 volatile int inhibit_comdat = __LINE__;
340 ALLOW_UNUSED_LOCAL(inhibit_comdat); 395 ALLOW_UNUSED_LOCAL(inhibit_comdat);
341 thread.reset(); 396 thread.reset();
342 } 397 }
343 398
344 NOINLINE void ResetThread_IndexedDb(std::unique_ptr<base::Thread> thread) { 399 NOINLINE void ResetThread_IndexedDb(std::unique_ptr<base::Thread> thread) {
345 volatile int inhibit_comdat = __LINE__; 400 volatile int inhibit_comdat = __LINE__;
(...skipping 530 matching lines...) Expand 10 before | Expand all | Expand 10 after
876 ui_message_loop_options.message_loop_type = base::MessageLoop::TYPE_UI; 931 ui_message_loop_options.message_loop_type = base::MessageLoop::TYPE_UI;
877 932
878 // Start threads in the order they occur in the BrowserThread::ID 933 // Start threads in the order they occur in the BrowserThread::ID
879 // enumeration, except for BrowserThread::UI which is the main 934 // enumeration, except for BrowserThread::UI which is the main
880 // thread. 935 // thread.
881 // 936 //
882 // Must be size_t so we can increment it. 937 // Must be size_t so we can increment it.
883 for (size_t thread_id = BrowserThread::UI + 1; 938 for (size_t thread_id = BrowserThread::UI + 1;
884 thread_id < BrowserThread::ID_COUNT; 939 thread_id < BrowserThread::ID_COUNT;
885 ++thread_id) { 940 ++thread_id) {
886 std::unique_ptr<BrowserProcessSubThread>* thread_to_start = NULL; 941 // If this thread ID is backed by a real thread, |thread_to_start| will be
942 // set to the appropriate |BrowserProcessSubThread*|. And |options| can be
fdoray 2016/12/01 15:15:21 s/|BrowserProcessSubThread*|/BrowserProcessSubThre
gab 2016/12/07 19:15:26 Done.
943 // updated away from its default.
944 std::unique_ptr<BrowserProcessSubThread>* thread_to_start = nullptr;
887 base::Thread::Options options; 945 base::Thread::Options options;
888 946
947 // Otherwise this thread ID will be backed by a SingleThreadTaskRunner in
948 // which case |task_runner_to_create| will be set to the appropriate
949 // |SingleThreadTaskRunner*| and |task_runner_traits| can be updated away
fdoray 2016/12/01 15:15:21 s/|SingleThreadTaskRunner*|/SingleThreadTaskRunner
gab 2016/12/07 19:15:26 Done.
950 // from its default. |execution_mode| defaults to |SINGLE_THREADED| as-is
fdoray 2016/12/01 15:15:21 No more |execution_mode|.
gab 2016/12/07 19:15:26 Done.
951 // appropriate to map most old browser threads but can also be updated in
952 // the switch statement below if a thread has specific requirements.
953 scoped_refptr<base::SingleThreadTaskRunner>* task_runner_to_create =
954 nullptr;
955 base::TaskTraits task_runner_traits;
956
957 const bool redirect_nonUInonIO_browser_threads =
fdoray 2016/12/01 15:15:21 Move outside the loop.
gab 2016/12/07 19:15:27 Done.
958 GetContentClient()
959 ->browser()
960 ->RedirectNonUINonIOBrowserThreadsToTaskScheduler();
961
889 switch (thread_id) { 962 switch (thread_id) {
890 case BrowserThread::DB: 963 case BrowserThread::DB:
891 TRACE_EVENT_BEGIN1("startup", 964 TRACE_EVENT_BEGIN1("startup",
892 "BrowserMainLoop::CreateThreads:start", 965 "BrowserMainLoop::CreateThreads:start",
893 "Thread", "BrowserThread::DB"); 966 "Thread", "BrowserThread::DB");
894 thread_to_start = &db_thread_; 967 if (redirect_nonUInonIO_browser_threads) {
895 options.timer_slack = base::TIMER_SLACK_MAXIMUM; 968 task_runner_to_create = &db_task_runner_;
969 task_runner_traits.WithFileIO()
fdoray 2016/12/01 15:15:21 Add WithWait() to allow AssertIOAllowed()?
gab 2016/12/07 19:15:27 Assuming you mean "to allow AssertWaitAllowed()".
970 .WithPriority(base::TaskPriority::USER_VISIBLE)
971 .WithShutdownBehavior(base::TaskShutdownBehavior::BLOCK_SHUTDOWN);
972 } else {
973 thread_to_start = &db_thread_;
974 options.timer_slack = base::TIMER_SLACK_MAXIMUM;
975 }
896 break; 976 break;
897 case BrowserThread::FILE_USER_BLOCKING: 977 case BrowserThread::FILE_USER_BLOCKING:
898 TRACE_EVENT_BEGIN1("startup", 978 TRACE_EVENT_BEGIN1("startup",
899 "BrowserMainLoop::CreateThreads:start", 979 "BrowserMainLoop::CreateThreads:start",
900 "Thread", "BrowserThread::FILE_USER_BLOCKING"); 980 "Thread", "BrowserThread::FILE_USER_BLOCKING");
901 thread_to_start = &file_user_blocking_thread_; 981 if (redirect_nonUInonIO_browser_threads) {
982 task_runner_to_create = &file_user_blocking_task_runner_;
983 task_runner_traits.WithFileIO()
984 .WithPriority(base::TaskPriority::USER_BLOCKING)
985 .WithShutdownBehavior(base::TaskShutdownBehavior::BLOCK_SHUTDOWN);
986 } else {
987 thread_to_start = &file_user_blocking_thread_;
988 }
902 break; 989 break;
903 case BrowserThread::FILE: 990 case BrowserThread::FILE:
904 TRACE_EVENT_BEGIN1("startup", 991 TRACE_EVENT_BEGIN1("startup",
905 "BrowserMainLoop::CreateThreads:start", 992 "BrowserMainLoop::CreateThreads:start",
906 "Thread", "BrowserThread::FILE"); 993 "Thread", "BrowserThread::FILE");
994
995 #if defined(OS_WIN)
996 // On Windows, the FILE thread needs to be have a UI message loop which
997 // pumps messages in such a way that Google Update can communicate back
998 // to us.
999 // TODO(robliao): Need to support COM in TaskScheduler before
1000 // redirecting the FILE thread on Windows. http://crbug.com/662122
907 thread_to_start = &file_thread_; 1001 thread_to_start = &file_thread_;
908 #if defined(OS_WIN)
909 // On Windows, the FILE thread needs to be have a UI message loop
910 // which pumps messages in such a way that Google Update can
911 // communicate back to us.
912 options = ui_message_loop_options; 1002 options = ui_message_loop_options;
913 #else 1003 #else
914 options = io_message_loop_options; 1004 if (redirect_nonUInonIO_browser_threads) {
1005 task_runner_to_create = &file_task_runner_;
1006 task_runner_traits.WithFileIO()
1007 .WithPriority(base::TaskPriority::BACKGROUND)
1008 .WithShutdownBehavior(base::TaskShutdownBehavior::BLOCK_SHUTDOWN);
1009 } else {
1010 thread_to_start = &file_thread_;
1011 options = io_message_loop_options;
1012 options.timer_slack = base::TIMER_SLACK_MAXIMUM;
1013 }
915 #endif 1014 #endif
916 options.timer_slack = base::TIMER_SLACK_MAXIMUM;
917 break; 1015 break;
918 case BrowserThread::PROCESS_LAUNCHER: 1016 case BrowserThread::PROCESS_LAUNCHER:
919 TRACE_EVENT_BEGIN1("startup", 1017 TRACE_EVENT_BEGIN1("startup",
920 "BrowserMainLoop::CreateThreads:start", 1018 "BrowserMainLoop::CreateThreads:start",
921 "Thread", "BrowserThread::PROCESS_LAUNCHER"); 1019 "Thread", "BrowserThread::PROCESS_LAUNCHER");
922 thread_to_start = &process_launcher_thread_; 1020 if (redirect_nonUInonIO_browser_threads) {
923 options.timer_slack = base::TIMER_SLACK_MAXIMUM; 1021 task_runner_to_create = &process_launcher_task_runner_;
1022 task_runner_traits.WithFileIO()
1023 .WithPriority(base::TaskPriority::USER_BLOCKING)
1024 .WithShutdownBehavior(base::TaskShutdownBehavior::BLOCK_SHUTDOWN);
1025 } else {
1026 thread_to_start = &process_launcher_thread_;
1027 options.timer_slack = base::TIMER_SLACK_MAXIMUM;
1028 }
924 break; 1029 break;
925 case BrowserThread::CACHE: 1030 case BrowserThread::CACHE:
926 TRACE_EVENT_BEGIN1("startup", 1031 TRACE_EVENT_BEGIN1("startup",
927 "BrowserMainLoop::CreateThreads:start", 1032 "BrowserMainLoop::CreateThreads:start",
928 "Thread", "BrowserThread::CACHE"); 1033 "Thread", "BrowserThread::CACHE");
1034 #if defined(OS_WIN)
1035 // TaskScheduler doesn't support async I/O on Windows as CACHE thread is
1036 // the only user and this use case is going away in
1037 // https://codereview.chromium.org/2216583003/. TODO(gavinp): Remove
1038 // this ifdef (and thus enable redirection of the CACHE thread on
1039 // Windows) once that CL lands.
929 thread_to_start = &cache_thread_; 1040 thread_to_start = &cache_thread_;
930 #if defined(OS_WIN)
931 options = io_message_loop_options; 1041 options = io_message_loop_options;
932 #endif // defined(OS_WIN)
933 options.timer_slack = base::TIMER_SLACK_MAXIMUM; 1042 options.timer_slack = base::TIMER_SLACK_MAXIMUM;
1043 #else // OS_WIN
1044 if (redirect_nonUInonIO_browser_threads) {
1045 task_runner_to_create = &cache_task_runner_;
1046 task_runner_traits.WithFileIO()
1047 .WithPriority(base::TaskPriority::USER_BLOCKING)
1048 .WithShutdownBehavior(base::TaskShutdownBehavior::BLOCK_SHUTDOWN);
1049 } else {
1050 thread_to_start = &cache_thread_;
1051 options.timer_slack = base::TIMER_SLACK_MAXIMUM;
1052 }
1053 #endif // OS_WIN
934 break; 1054 break;
935 case BrowserThread::IO: 1055 case BrowserThread::IO:
936 TRACE_EVENT_BEGIN1("startup", 1056 TRACE_EVENT_BEGIN1("startup",
937 "BrowserMainLoop::CreateThreads:start", 1057 "BrowserMainLoop::CreateThreads:start",
938 "Thread", "BrowserThread::IO"); 1058 "Thread", "BrowserThread::IO");
939 thread_to_start = &io_thread_; 1059 thread_to_start = &io_thread_;
940 options = io_message_loop_options; 1060 options = io_message_loop_options;
941 #if defined(OS_ANDROID) || defined(OS_CHROMEOS) 1061 #if defined(OS_ANDROID) || defined(OS_CHROMEOS)
942 // Up the priority of the |io_thread_| as some of its IPCs relate to 1062 // Up the priority of the |io_thread_| as some of its IPCs relate to
943 // display tasks. 1063 // display tasks.
944 options.priority = base::ThreadPriority::DISPLAY; 1064 options.priority = base::ThreadPriority::DISPLAY;
945 #endif 1065 #endif
946 break; 1066 break;
947 case BrowserThread::UI: 1067 case BrowserThread::UI: // Falls through.
948 case BrowserThread::ID_COUNT: 1068 case BrowserThread::ID_COUNT: // Falls through.
949 default:
950 NOTREACHED(); 1069 NOTREACHED();
951 break; 1070 break;
952 } 1071 }
953 1072
954 BrowserThread::ID id = static_cast<BrowserThread::ID>(thread_id); 1073 BrowserThread::ID id = static_cast<BrowserThread::ID>(thread_id);
955 1074
956 if (thread_to_start) { 1075 if (thread_to_start) {
1076 DCHECK(!task_runner_to_create);
957 (*thread_to_start).reset(new BrowserProcessSubThread(id)); 1077 (*thread_to_start).reset(new BrowserProcessSubThread(id));
958 if (!(*thread_to_start)->StartWithOptions(options)) { 1078 if (!(*thread_to_start)->StartWithOptions(options)) {
959 LOG(FATAL) << "Failed to start the browser thread: id == " << id; 1079 LOG(FATAL) << "Failed to start the browser thread: id == " << id;
960 } 1080 }
1081 } else if (task_runner_to_create) {
fdoray 2016/12/01 15:15:21 DCHECK(!thread_to_start);
gab 2016/12/07 19:15:27 This is implicit in else block of if (thread_to_st
1082 *task_runner_to_create =
1083 base::CreateSingleThreadTaskRunnerWithTraits(task_runner_traits);
1084 DCHECK(*task_runner_to_create);
1085 BrowserThreadImpl::RedirectThreadIDToTaskRunner(
1086 id, task_runner_to_create->get());
961 } else { 1087 } else {
962 NOTREACHED(); 1088 NOTREACHED();
963 } 1089 }
964 1090
965 TRACE_EVENT_END0("startup", "BrowserMainLoop::CreateThreads:start"); 1091 TRACE_EVENT_END0("startup", "BrowserMainLoop::CreateThreads:start");
966 } 1092 }
967 created_threads_ = true; 1093 created_threads_ = true;
968 return result_code_; 1094 return result_code_;
969 } 1095 }
970 1096
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
1103 // - The IO thread is the only user of the CACHE thread. 1229 // - The IO thread is the only user of the CACHE thread.
1104 // 1230 //
1105 // - The PROCESS_LAUNCHER thread must be stopped after IO in case 1231 // - The PROCESS_LAUNCHER thread must be stopped after IO in case
1106 // the IO thread posted a task to terminate a process on the 1232 // the IO thread posted a task to terminate a process on the
1107 // process launcher thread. 1233 // process launcher thread.
1108 // 1234 //
1109 // - (Not sure why DB stops last.) 1235 // - (Not sure why DB stops last.)
1110 switch (thread_id) { 1236 switch (thread_id) {
1111 case BrowserThread::DB: { 1237 case BrowserThread::DB: {
1112 TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:DBThread"); 1238 TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:DBThread");
1113 ResetThread_DB(std::move(db_thread_)); 1239 ResetThread_DB(std::move(db_thread_), std::move(db_task_runner_));
1114 break; 1240 break;
1115 } 1241 }
1116 case BrowserThread::FILE: { 1242 case BrowserThread::FILE: {
1117 TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:FileThread"); 1243 TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:FileThread");
1118 // Clean up state that lives on or uses the file_thread_ before 1244 // Clean up state that lives on or uses the file_thread_ before it goes
fdoray 2016/12/01 15:15:21 the FILE thread
gab 2016/12/07 19:15:26 Done.
1119 // it goes away. 1245 // away.
1120 save_file_manager_->Shutdown(); 1246 save_file_manager_->Shutdown();
1121 ResetThread_FILE(std::move(file_thread_)); 1247 ResetThread_FILE(std::move(file_thread_), std::move(file_task_runner_));
1122 break; 1248 break;
1123 } 1249 }
1124 case BrowserThread::FILE_USER_BLOCKING: { 1250 case BrowserThread::FILE_USER_BLOCKING: {
1125 TRACE_EVENT0("shutdown", 1251 TRACE_EVENT0("shutdown",
1126 "BrowserMainLoop::Subsystem:FileUserBlockingThread"); 1252 "BrowserMainLoop::Subsystem:FileUserBlockingThread");
1127 ResetThread_FILE_USER_BLOCKING(std::move(file_user_blocking_thread_)); 1253 ResetThread_FILE_USER_BLOCKING(
1254 std::move(file_user_blocking_thread_),
1255 std::move(file_user_blocking_task_runner_));
1128 break; 1256 break;
1129 } 1257 }
1130 case BrowserThread::PROCESS_LAUNCHER: { 1258 case BrowserThread::PROCESS_LAUNCHER: {
1131 TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:LauncherThread"); 1259 TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:LauncherThread");
1132 ResetThread_PROCESS_LAUNCHER(std::move(process_launcher_thread_)); 1260 ResetThread_PROCESS_LAUNCHER(std::move(process_launcher_thread_),
1261 std::move(process_launcher_task_runner_));
1133 break; 1262 break;
1134 } 1263 }
1135 case BrowserThread::CACHE: { 1264 case BrowserThread::CACHE: {
1136 TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:CacheThread"); 1265 TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:CacheThread");
1137 ResetThread_CACHE(std::move(cache_thread_)); 1266 ResetThread_CACHE(std::move(cache_thread_),
1267 std::move(cache_task_runner_));
1138 break; 1268 break;
1139 } 1269 }
1140 case BrowserThread::IO: { 1270 case BrowserThread::IO: {
1141 TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:IOThread"); 1271 TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:IOThread");
1142 ResetThread_IO(std::move(io_thread_)); 1272 ResetThread_IO(std::move(io_thread_));
1143 break; 1273 break;
1144 } 1274 }
1145 case BrowserThread::UI: 1275 case BrowserThread::UI:
1146 case BrowserThread::ID_COUNT: 1276 case BrowserThread::ID_COUNT:
1147 default:
1148 NOTREACHED(); 1277 NOTREACHED();
1149 break; 1278 break;
1150 } 1279 }
1151 } 1280 }
1152 { 1281 {
1153 TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:IndexedDBThread"); 1282 TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:IndexedDBThread");
1154 ResetThread_IndexedDb(std::move(indexed_db_thread_)); 1283 ResetThread_IndexedDb(std::move(indexed_db_thread_));
1155 } 1284 }
1156 1285
1157 // Close the blocking I/O pool after the other threads. Other threads such 1286 // Close the blocking I/O pool after the other threads. Other threads such
(...skipping 468 matching lines...) Expand 10 before | Expand all | Expand 10 after
1626 scoped_refptr<base::SingleThreadTaskRunner> worker_task_runner = 1755 scoped_refptr<base::SingleThreadTaskRunner> worker_task_runner =
1627 audio_thread_->task_runner(); 1756 audio_thread_->task_runner();
1628 audio_manager_ = media::AudioManager::Create(std::move(audio_task_runner), 1757 audio_manager_ = media::AudioManager::Create(std::move(audio_task_runner),
1629 std::move(worker_task_runner), 1758 std::move(worker_task_runner),
1630 MediaInternals::GetInstance()); 1759 MediaInternals::GetInstance());
1631 } 1760 }
1632 CHECK(audio_manager_); 1761 CHECK(audio_manager_);
1633 } 1762 }
1634 1763
1635 } // namespace content 1764 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698