| Index: content/child/child_process.cc
|
| diff --git a/content/child/child_process.cc b/content/child/child_process.cc
|
| index 7c5b408e842e328c5f0b8c2edc1abe0beb91a41b..19b28b7c5118efff1e539df86169f824dd1bdd69 100644
|
| --- a/content/child/child_process.cc
|
| +++ b/content/child/child_process.cc
|
| @@ -13,6 +13,7 @@
|
| #include "base/single_thread_task_runner.h"
|
| #include "base/strings/string_number_conversions.h"
|
| #include "base/strings/utf_string_conversions.h"
|
| +#include "base/task_scheduler/task_scheduler.h"
|
| #include "base/threading/thread.h"
|
| #include "base/threading/thread_local.h"
|
| #include "build/build_config.h"
|
| @@ -47,6 +48,15 @@ ChildProcess::ChildProcess(base::ThreadPriority io_thread_priority)
|
|
|
| base::StatisticsRecorder::Initialize();
|
|
|
| + // Initialize TaskScheduler if not already done. A TaskScheduler may already
|
| + // exist when ChildProcess is instantiated in the browser process or in a
|
| + // test process.
|
| + if (!base::TaskScheduler::GetInstance()) {
|
| + InitializeTaskScheduler();
|
| + DCHECK(base::TaskScheduler::GetInstance());
|
| + initialized_task_scheduler_ = true;
|
| + }
|
| +
|
| // We can't recover from failing to start the IO thread.
|
| base::Thread::Options thread_options(base::MessageLoop::TYPE_IO, 0);
|
| thread_options.priority = io_thread_priority;
|
| @@ -80,6 +90,11 @@ ChildProcess::~ChildProcess() {
|
|
|
| g_lazy_tls.Pointer()->Set(NULL);
|
| io_thread_.Stop();
|
| +
|
| + if (initialized_task_scheduler_) {
|
| + DCHECK(base::TaskScheduler::GetInstance());
|
| + base::TaskScheduler::GetInstance()->Shutdown();
|
| + }
|
| }
|
|
|
| ChildThreadImpl* ChildProcess::main_thread() {
|
| @@ -162,4 +177,9 @@ void ChildProcess::WaitForDebugger(const std::string& label) {
|
| #endif // defined(OS_POSIX)
|
| }
|
|
|
| +void ChildProcess::InitializeTaskScheduler() {
|
| + constexpr int kMaxThreads = 2;
|
| + base::TaskScheduler::CreateAndSetSimpleTaskScheduler(kMaxThreads);
|
| +}
|
| +
|
| } // namespace content
|
|
|