Chromium Code Reviews| Index: content/renderer/render_process_impl.cc |
| diff --git a/content/renderer/render_process_impl.cc b/content/renderer/render_process_impl.cc |
| index 0ad4d1b0066be8c76af12461a3d9c798bd51371a..1b7a64eac4ffe5895688f296eb4a606a134667be 100644 |
| --- a/content/renderer/render_process_impl.cc |
| +++ b/content/renderer/render_process_impl.cc |
| @@ -12,10 +12,17 @@ |
| #include <mlang.h> |
| #endif |
| +#include <stddef.h> |
| + |
| +#include <vector> |
| + |
| #include "base/command_line.h" |
| #include "base/compiler_specific.h" |
| #include "base/feature_list.h" |
| #include "base/sys_info.h" |
| +#include "base/task_scheduler/scheduler_worker_pool_params.h" |
| +#include "base/task_scheduler/task_scheduler.h" |
| +#include "base/threading/sequenced_worker_pool.h" |
| #include "content/child/site_isolation_stats_gatherer.h" |
| #include "content/public/common/content_features.h" |
| #include "content/public/common/content_switches.h" |
| @@ -23,6 +30,10 @@ |
| #include "third_party/WebKit/public/web/WebFrame.h" |
| #include "v8/include/v8.h" |
| +namespace base { |
| +class TaskTraits; |
| +} |
| + |
| namespace { |
| const base::Feature kV8_ES2015_TailCalls_Feature { |
| @@ -50,12 +61,39 @@ void SetV8FlagIfHasSwitch(const char* switch_name, const char* v8_flag) { |
| } |
| } |
| +bool MaybeInitializeTaskScheduler() { |
|
robliao
2016/11/14 16:05:26
What's the behavior when base linked to chrome.dll
gab
2016/11/14 16:16:43
Hmm? base is linked to both but any process instan
fdoray
2016/11/15 16:30:34
--single-process only works in component builds ht
|
| + // TaskScheduler already exists when the renderer runs inside the browser |
| + // process. |
| + if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
|
gab
2016/11/14 16:16:43
Use base::TaskScheduler::GetInstance() instead? (p
fdoray
2016/11/15 16:30:34
Done. With some changes because I don't want a Ren
|
| + switches::kSingleProcess)) { |
| + return false; |
| + } |
| + |
| + std::vector<base::SchedulerWorkerPoolParams> worker_pool_params_vector; |
| + base::Callback<size_t(const base::TaskTraits& traits)> |
| + worker_pool_index_for_traits_callback; |
| + bool should_redirect_sequenced_worker_pool = false; |
| + |
| + if (!content::GetContentClient()->renderer()->ShouldInitializeTaskScheduler( |
| + &worker_pool_params_vector, &worker_pool_index_for_traits_callback, |
| + &should_redirect_sequenced_worker_pool)) { |
| + return false; |
| + } |
| + |
| + base::TaskScheduler::CreateAndSetDefaultTaskScheduler( |
| + worker_pool_params_vector, worker_pool_index_for_traits_callback); |
| + |
| + if (should_redirect_sequenced_worker_pool) |
| + base::SequencedWorkerPool::RedirectToTaskSchedulerForProcess(); |
| + |
| + return true; |
| +} |
| + |
| } // namespace |
| namespace content { |
| -RenderProcessImpl::RenderProcessImpl() |
| - : enabled_bindings_(0) { |
| +RenderProcessImpl::RenderProcessImpl() { |
| #if defined(OS_WIN) |
| // HACK: See http://b/issue?id=1024307 for rationale. |
| if (GetModuleHandle(L"LPK.DLL") == NULL) { |
| @@ -103,6 +141,8 @@ RenderProcessImpl::RenderProcessImpl() |
| SiteIsolationStatsGatherer::SetEnabled( |
| GetContentClient()->renderer()->ShouldGatherSiteIsolationStats()); |
| + |
| + initialized_task_scheduler_ = MaybeInitializeTaskScheduler(); |
| } |
| RenderProcessImpl::~RenderProcessImpl() { |
| @@ -112,6 +152,11 @@ RenderProcessImpl::~RenderProcessImpl() { |
| DLOG(ERROR) << "WebFrame LEAKED " << count << " TIMES"; |
| #endif |
| + if (initialized_task_scheduler_) { |
| + DCHECK(base::TaskScheduler::GetInstance()); |
| + base::TaskScheduler::GetInstance()->Shutdown(); |
| + } |
| + |
| GetShutDownEvent()->Signal(); |
| } |