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..0c64f2e11bcfa44e19c0832065188ab95a594bcb 100644 |
| --- a/content/renderer/render_process_impl.cc |
| +++ b/content/renderer/render_process_impl.cc |
| @@ -12,10 +12,21 @@ |
| #include <mlang.h> |
| #endif |
| +#include <stddef.h> |
| + |
| +#include <vector> |
| + |
| +#include "base/bind.h" |
| #include "base/command_line.h" |
| #include "base/compiler_specific.h" |
| #include "base/feature_list.h" |
| #include "base/sys_info.h" |
| +#include "base/task_scheduler/initialization_util.h" |
| +#include "base/task_scheduler/scheduler_worker_pool_params.h" |
| +#include "base/task_scheduler/task_scheduler.h" |
| +#include "base/task_scheduler/task_traits.h" |
| +#include "base/threading/platform_thread.h" |
| +#include "base/time/time.h" |
| #include "content/child/site_isolation_stats_gatherer.h" |
| #include "content/public/common/content_features.h" |
| #include "content/public/common/content_switches.h" |
| @@ -25,6 +36,14 @@ |
| namespace { |
| +enum WorkerPoolType : size_t { |
| + BACKGROUND = 0, |
| + BACKGROUND_FILE_IO, |
| + FOREGROUND, |
| + FOREGROUND_FILE_IO, |
| + WORKER_POOL_COUNT // Always last. |
| +}; |
| + |
| const base::Feature kV8_ES2015_TailCalls_Feature { |
| "V8_ES2015_TailCalls", base::FEATURE_DISABLED_BY_DEFAULT |
| }; |
| @@ -50,6 +69,99 @@ void SetV8FlagIfHasSwitch(const char* switch_name, const char* v8_flag) { |
| } |
| } |
| +std::vector<base::SchedulerWorkerPoolParams> |
| +GetDefaultSchedulerWorkerPoolParams() { |
| + using StandbyThreadPolicy = |
| + base::SchedulerWorkerPoolParams::StandbyThreadPolicy; |
| + using ThreadPriority = base::ThreadPriority; |
| + std::vector<base::SchedulerWorkerPoolParams> params_vector; |
| +#if defined(OS_ANDROID) |
| + params_vector.emplace_back( |
| + "RendererBackground", ThreadPriority::BACKGROUND, |
| + StandbyThreadPolicy::LAZY, |
| + base::RecommendedMaxNumberOfThreadsInPool(2, 8, 0.1, 0), |
| + base::TimeDelta::FromSeconds(30)); |
| + params_vector.emplace_back( |
| + "RendererBackgroundFileIO", ThreadPriority::BACKGROUND, |
| + StandbyThreadPolicy::LAZY, |
| + base::RecommendedMaxNumberOfThreadsInPool(2, 8, 0.1, 0), |
| + base::TimeDelta::FromSeconds(30)); |
| + params_vector.emplace_back( |
| + "RendererForeground", ThreadPriority::NORMAL, StandbyThreadPolicy::LAZY, |
| + base::RecommendedMaxNumberOfThreadsInPool(3, 8, 0.3, 0), |
| + base::TimeDelta::FromSeconds(30)); |
| + params_vector.emplace_back( |
| + "RendererForegroundFileIO", ThreadPriority::NORMAL, |
| + StandbyThreadPolicy::LAZY, |
| + base::RecommendedMaxNumberOfThreadsInPool(3, 8, 0.1, 0), |
| + base::TimeDelta::FromSeconds(30)); |
| +#else |
| + params_vector.emplace_back( |
| + "RendererBackground", ThreadPriority::BACKGROUND, |
| + StandbyThreadPolicy::LAZY, |
| + base::RecommendedMaxNumberOfThreadsInPool(3, 8, 0.1, 0), |
| + base::TimeDelta::FromSeconds(30)); |
| + params_vector.emplace_back( |
| + "RendererBackgroundFileIO", ThreadPriority::BACKGROUND, |
| + StandbyThreadPolicy::LAZY, |
| + base::RecommendedMaxNumberOfThreadsInPool(3, 8, 0.1, 0), |
| + base::TimeDelta::FromSeconds(30)); |
| + params_vector.emplace_back( |
| + "RendererForeground", ThreadPriority::NORMAL, StandbyThreadPolicy::LAZY, |
| + base::RecommendedMaxNumberOfThreadsInPool(8, 32, 0.3, 0), |
| + base::TimeDelta::FromSeconds(30)); |
| + params_vector.emplace_back( |
| + "RendererForegroundFileIO", ThreadPriority::NORMAL, |
| + StandbyThreadPolicy::LAZY, |
| + base::RecommendedMaxNumberOfThreadsInPool(8, 32, 0.3, 0), |
|
gab
2016/12/09 20:20:55
Don't think we want nearly that many threads. Let'
|
| + base::TimeDelta::FromSeconds(30)); |
| +#endif |
| + DCHECK_EQ(WORKER_POOL_COUNT, params_vector.size()); |
| + return params_vector; |
| +} |
| + |
| +// Returns the worker pool index for |traits| based off of worker pools defined |
| +// in GetDefaultSchedulerWorkerPoolParams(). Defaults to FOREGROUND. |
| +size_t DefaultRendererWorkerPoolIndexForTraits(const base::TaskTraits& traits) { |
| + const bool is_background = |
| + traits.priority() == base::TaskPriority::BACKGROUND; |
| + if (traits.with_file_io()) |
| + return is_background ? BACKGROUND_FILE_IO : FOREGROUND_FILE_IO; |
| + |
| + return is_background ? BACKGROUND : FOREGROUND; |
| +} |
| + |
| +bool IsSingleProcess() { |
| + return base::CommandLine::ForCurrentProcess()->HasSwitch( |
| + switches::kSingleProcess); |
| +} |
| + |
| +void InitializeTaskScheduler() { |
| + if (IsSingleProcess()) { |
| + // There should already be a TaskScheduler when the renderer runs inside the |
| + // browser process. |
| + DCHECK(base::TaskScheduler::GetInstance()); |
| + return; |
| + } |
| + DCHECK(!base::TaskScheduler::GetInstance()); |
| + |
| + std::vector<base::SchedulerWorkerPoolParams> params_vector; |
| + base::TaskScheduler::WorkerPoolIndexForTraitsCallback |
| + index_to_traits_callback; |
| + GetContentClient()->renderer()->GetTaskSchedulerInitializationParams( |
| + ¶ms_vector, &index_to_traits_callback); |
| + |
| + if (params_vector.empty()) { |
| + params_vector = GetDefaultSchedulerWorkerPoolParams(); |
| + index_to_traits_callback = |
| + base::Bind(&DefaultRendererWorkerPoolIndexForTraits); |
| + } |
| + DCHECK(index_to_traits_callback); |
| + |
| + base::TaskScheduler::CreateAndSetDefaultTaskScheduler( |
| + params_vector, index_to_traits_callback); |
| +} |
| + |
| } // namespace |
| namespace content { |
| @@ -103,6 +215,8 @@ RenderProcessImpl::RenderProcessImpl() |
| SiteIsolationStatsGatherer::SetEnabled( |
| GetContentClient()->renderer()->ShouldGatherSiteIsolationStats()); |
| + |
| + InitializeTaskScheduler(); |
| } |
| RenderProcessImpl::~RenderProcessImpl() { |
| @@ -112,6 +226,11 @@ RenderProcessImpl::~RenderProcessImpl() { |
| DLOG(ERROR) << "WebFrame LEAKED " << count << " TIMES"; |
| #endif |
| + if (!IsSingleProcess()) { |
| + DCHECK(base::TaskScheduler::GetInstance()); |
| + base::TaskScheduler::GetInstance()->Shutdown(); |
| + } |
| + |
| GetShutDownEvent()->Signal(); |
| } |