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..24979293f496d18c339a74fdd50454e9cfe04db1 100644 |
--- a/content/renderer/render_process_impl.cc |
+++ b/content/renderer/render_process_impl.cc |
@@ -12,11 +12,23 @@ |
#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_client.h" |
#include "content/public/common/content_features.h" |
#include "content/public/common/content_switches.h" |
#include "content/public/renderer/content_renderer_client.h" |
@@ -25,6 +37,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 +70,72 @@ 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; |
+ params_vector.emplace_back("RendererBackground", ThreadPriority::BACKGROUND, |
+ StandbyThreadPolicy::LAZY, 1, |
jam
2016/12/13 01:28:22
all the numbers here and below are magic to someon
fdoray
2016/12/13 16:19:51
Done.
|
+ base::TimeDelta::FromSeconds(30)); |
+ params_vector.emplace_back( |
+ "RendererBackgroundFileIO", ThreadPriority::BACKGROUND, |
+ StandbyThreadPolicy::LAZY, 1, base::TimeDelta::FromSeconds(30)); |
+ params_vector.emplace_back( |
+ "RendererForeground", ThreadPriority::NORMAL, StandbyThreadPolicy::LAZY, |
+ base::RecommendedMaxNumberOfThreadsInPool(2, 4, 1, 0), |
+ base::TimeDelta::FromSeconds(30)); |
+ params_vector.emplace_back("RendererForegroundFileIO", ThreadPriority::NORMAL, |
+ StandbyThreadPolicy::LAZY, 1, |
+ base::TimeDelta::FromSeconds(30)); |
+ DCHECK_EQ(WORKER_POOL_COUNT, params_vector.size()); |
+ return params_vector; |
+} |
+ |
+// Returns the worker pool index for |traits| defaulting to FOREGROUND or |
+// FOREGROUND_FILE_IO on any other priorities based off of worker pools defined |
+// in GetDefaultSchedulerWorkerPoolParams(). |
+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() { |
jam
2016/12/13 01:28:22
nit: we don't generally use helper methods for che
fdoray
2016/12/13 16:19:51
Done.
|
+ 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; |
+ content::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 +189,8 @@ RenderProcessImpl::RenderProcessImpl() |
SiteIsolationStatsGatherer::SetEnabled( |
GetContentClient()->renderer()->ShouldGatherSiteIsolationStats()); |
+ |
+ InitializeTaskScheduler(); |
} |
RenderProcessImpl::~RenderProcessImpl() { |
@@ -112,6 +200,11 @@ RenderProcessImpl::~RenderProcessImpl() { |
DLOG(ERROR) << "WebFrame LEAKED " << count << " TIMES"; |
#endif |
+ if (!IsSingleProcess()) { |
+ DCHECK(base::TaskScheduler::GetInstance()); |
+ base::TaskScheduler::GetInstance()->Shutdown(); |
+ } |
+ |
GetShutDownEvent()->Signal(); |
} |