Index: components/task_scheduler_util/initialization/browser_util.cc |
diff --git a/components/task_scheduler_util/initialization/browser_util.cc b/components/task_scheduler_util/initialization/browser_util.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..a468281718b14b8f7b2e7a15d13e2d3a450c4936 |
--- /dev/null |
+++ b/components/task_scheduler_util/initialization/browser_util.cc |
@@ -0,0 +1,141 @@ |
+// Copyright 2016 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "components/task_scheduler_util/initialization/browser_util.h" |
+ |
+#include <map> |
+#include <string> |
+ |
+#include "base/task_scheduler/initialization_util.h" |
+#include "base/task_scheduler/switches.h" |
+#include "base/task_scheduler/task_traits.h" |
+#include "base/threading/sequenced_worker_pool.h" |
+#include "build/build_config.h" |
+ |
+namespace task_scheduler_util { |
+namespace initialization { |
+ |
+namespace { |
+ |
+using StandbyThreadPolicy = |
+ base::SchedulerWorkerPoolParams::StandbyThreadPolicy; |
+using ThreadPriority = base::ThreadPriority; |
+ |
+struct SchedulerWorkerPoolCustomizableConfiguration { |
+ SchedulerWorkerPoolCustomizableConfiguration( |
+ const char* name_in, |
+ ThreadPriority priority_hint_in, |
+ const SingleWorkerPoolConfiguration& single_worker_pool_config_in) |
+ : name(name_in), |
+ priority_hint(priority_hint_in), |
+ single_worker_pool_config(single_worker_pool_config_in) {} |
+ |
+ const char* name; |
+ ThreadPriority priority_hint; |
+ const SingleWorkerPoolConfiguration& single_worker_pool_config; |
+}; |
+ |
+} // namespace |
+ |
+std::vector<base::SchedulerWorkerPoolParams> |
+BrowserWorkerPoolConfigurationToSchedulerWorkerPoolParams( |
+ const BrowserWorkerPoolsConfiguration& config) { |
+ const SchedulerWorkerPoolCustomizableConfiguration worker_pool_config[] = { |
+ SchedulerWorkerPoolCustomizableConfiguration("Background", |
+ ThreadPriority::BACKGROUND, |
+ config.background), |
+ SchedulerWorkerPoolCustomizableConfiguration("BackgroundFileIO", |
+ ThreadPriority::BACKGROUND, |
+ config.background_file_io), |
+ SchedulerWorkerPoolCustomizableConfiguration("Foreground", |
+ ThreadPriority::NORMAL, |
+ config.foreground), |
+ SchedulerWorkerPoolCustomizableConfiguration("ForegroundFileIO", |
+ ThreadPriority::NORMAL, |
+ config.foreground_file_io), |
+ |
+ }; |
+ static_assert(arraysize(worker_pool_config) == WORKER_POOL_COUNT, |
+ "Mismatched Worker Pool Types and Predefined Parameters"); |
+ constexpr size_t kNumWorkerPoolsDefined = sizeof(config) / |
+ sizeof(config.background); |
+ static_assert(arraysize(worker_pool_config) == kNumWorkerPoolsDefined, |
+ "Mismatch in predefined parameters and worker pools."); |
+ std::vector<base::SchedulerWorkerPoolParams> params_vector; |
+ for (const auto& config : worker_pool_config) { |
+ params_vector.emplace_back( |
+ config.name, config.priority_hint, |
+ config.single_worker_pool_config.standby_thread_policy, |
+ config.single_worker_pool_config.threads, |
+ config.single_worker_pool_config.detach_period); |
+ } |
+ 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 priorities other than background. |
+size_t BrowserWorkerPoolIndexForTraits(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; |
+} |
+ |
+std::vector<base::SchedulerWorkerPoolParams> |
+GetDefaultBrowserSchedulerWorkerPoolParams() { |
+ constexpr size_t kNumWorkerPoolsDefined = |
+ sizeof(BrowserWorkerPoolsConfiguration) / |
+ sizeof(SingleWorkerPoolConfiguration); |
+ static_assert(kNumWorkerPoolsDefined == 4, |
+ "Expected 4 worker pools in BrowserWorkerPoolsConfiguration"); |
+ BrowserWorkerPoolsConfiguration config; |
+#if defined(OS_ANDROID) || defined(OS_IOS) |
+ config.background.standby_thread_policy = StandbyThreadPolicy::ONE; |
+ config.background.threads = |
+ base::RecommendedMaxNumberOfThreadsInPool(2, 8, 0.1, 0); |
+ config.background.detach_period = base::TimeDelta::FromSeconds(30); |
+ |
+ config.background_file_io.standby_thread_policy = StandbyThreadPolicy::ONE; |
+ config.background_file_io.threads = |
+ base::RecommendedMaxNumberOfThreadsInPool(2, 8, 0.1, 0); |
+ config.background_file_io.detach_period = base::TimeDelta::FromSeconds(30); |
+ |
+ config.foreground.standby_thread_policy = StandbyThreadPolicy::ONE; |
+ config.foreground.threads = |
+ base::RecommendedMaxNumberOfThreadsInPool(3, 8, 0.3, 0); |
+ config.foreground.detach_period = base::TimeDelta::FromSeconds(30); |
+ |
+ config.foreground_file_io.standby_thread_policy = StandbyThreadPolicy::ONE; |
+ config.foreground_file_io.threads = |
+ base::RecommendedMaxNumberOfThreadsInPool(3, 8, 0.3, 0); |
+ config.foreground_file_io.detach_period = base::TimeDelta::FromSeconds(30); |
+#else |
+ config.background.standby_thread_policy = StandbyThreadPolicy::ONE; |
+ config.background.threads = |
+ base::RecommendedMaxNumberOfThreadsInPool(3, 8, 0.1, 0); |
+ config.background.detach_period = base::TimeDelta::FromSeconds(30); |
+ |
+ config.background_file_io.standby_thread_policy = StandbyThreadPolicy::ONE; |
+ config.background_file_io.threads = |
+ base::RecommendedMaxNumberOfThreadsInPool(3, 8, 0.1, 0); |
+ config.background_file_io.detach_period = base::TimeDelta::FromSeconds(30); |
+ |
+ config.foreground.standby_thread_policy = StandbyThreadPolicy::ONE; |
+ config.foreground.threads = |
+ base::RecommendedMaxNumberOfThreadsInPool(8, 32, 0.3, 0); |
+ config.foreground.detach_period = base::TimeDelta::FromSeconds(30); |
+ |
+ config.foreground_file_io.standby_thread_policy = StandbyThreadPolicy::ONE; |
+ config.foreground_file_io.threads = |
+ base::RecommendedMaxNumberOfThreadsInPool(8, 32, 0.3, 0); |
+ config.foreground_file_io.detach_period = base::TimeDelta::FromSeconds(30); |
+#endif |
+ return BrowserWorkerPoolConfigurationToSchedulerWorkerPoolParams(config); |
+} |
+ |
+} // namespace initialization |
+} // namespace task_scheduler_util |