Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(59)

Unified Diff: ios/chrome/browser/ios_chrome_main_parts.mm

Issue 2459773002: Add TaskScheduler to iOS Startup (Closed)
Patch Set: Rebase to e414cb39 Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ios/chrome/browser/DEPS ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ios/chrome/browser/ios_chrome_main_parts.mm
diff --git a/ios/chrome/browser/ios_chrome_main_parts.mm b/ios/chrome/browser/ios_chrome_main_parts.mm
index 0397992f55eb8cd43cf5f092c8efe8a610e80846..72116c201ae362d3f1cd3cbc2fdd7765d0c8a51b 100644
--- a/ios/chrome/browser/ios_chrome_main_parts.mm
+++ b/ios/chrome/browser/ios_chrome_main_parts.mm
@@ -11,6 +11,8 @@
#include "base/memory/ptr_util.h"
#include "base/metrics/user_metrics.h"
#include "base/path_service.h"
+#include "base/task_scheduler/switches.h"
+#include "base/task_scheduler/task_scheduler.h"
#include "base/time/default_tick_clock.h"
#include "components/content_settings/core/browser/cookie_settings.h"
#include "components/content_settings/core/common/content_settings_pattern.h"
@@ -24,6 +26,7 @@
#include "components/prefs/json_pref_store.h"
#include "components/prefs/pref_service.h"
#include "components/rappor/rappor_service.h"
+#include "components/task_scheduler_util/initialization_util.h"
#include "components/translate/core/browser/translate_download_manager.h"
#include "components/variations/service/variations_service.h"
#include "components/variations/variations_http_header_provider.h"
@@ -55,6 +58,43 @@
#include "ios/chrome/browser/rlz/rlz_tracker_delegate_impl.h" // nogncheck
#endif
+namespace {
+
+void MaybeInitializeTaskScheduler() {
+ static constexpr char kFieldTrialName[] = "BrowserScheduler";
+ std::map<std::string, std::string> variation_params;
+ bool used_default_config = false;
+ if (!variations::GetVariationParams(kFieldTrialName, &variation_params)) {
+ if (!base::CommandLine::ForCurrentProcess()->HasSwitch(
+ switches::kEnableBrowserTaskScheduler)) {
+ return;
+ }
+
+ // TODO(robliao): Remove below once iOS uses fieldtrial_testing_config.json.
+ // Synchronize the below from fieldtrial_testing_config.json.
+ DCHECK(variation_params.empty());
+ variation_params["Background"] = "3;8;0.1;0;30000";
+ variation_params["BackgroundFileIO"] = "3;8;0.1;0;30000";
+ variation_params["Foreground"] = "8;32;0.3;0;30000";
+ variation_params["ForegroundFileIO"] = "8;32;0.3;0;30000";
+ used_default_config = true;
+ }
+
+ if (!task_scheduler_util::InitializeDefaultTaskScheduler(variation_params))
+ return;
+
+ // TODO(gab): Remove this when http://crbug.com/622400 concludes.
+ const auto sequenced_worker_pool_param =
+ variation_params.find("RedirectSequencedWorkerPools");
+ if (used_default_config ||
+ (sequenced_worker_pool_param != variation_params.end() &&
+ sequenced_worker_pool_param->second == "true")) {
+ base::SequencedWorkerPool::RedirectToTaskSchedulerForProcess();
+ }
+}
+
+} // namespace
+
IOSChromeMainParts::IOSChromeMainParts(
const base::CommandLine& parsed_command_line)
: parsed_command_line_(parsed_command_line), local_state_(nullptr) {
@@ -110,10 +150,28 @@ void IOSChromeMainParts::PreCreateThreads() {
base::MakeUnique<base::DefaultTickClock>(),
base::Bind(&metrics::IOSTrackingSynchronizerDelegate::Create));
- // Now the command line has been mutated based on about:flags, we can setup
- // metrics and initialize field trials that are needed by IOSChromeIOThread's
- // initialization which happens in ApplicationContext:PreCreateThreads.
+ // IMPORTANT
+ // Do not add anything below this line until you've verified your new code
+ // does not interfere with the critical initialization order below. Some of
+ // the calls below end up implicitly creating threads and as such new calls
+ // typically either belong before them or in a later startup phase.
+
+ // Now that the command line has been mutated based on about:flags, we can
+ // initialize field trials and setup metrics. The field trials are needed by
+ // IOThread's initialization in ApplicationContext's PreCreateThreads.
SetupFieldTrials();
+
+ // Task Scheduler initialization needs to be here for the following reasons:
+ // * After |SetupFieldTrials()|: Initialization uses variations.
+ // * Before |SetupMetrics()|: |SetupMetrics()| uses the blocking pool. The
+ // Task Scheduler must do any necessary redirection before then.
+ // * Near the end of |PreCreateThreads()|: The TaskScheduler needs to be
+ // created before any other threads are (by contract) but it creates
+ // threads itself so instantiating it earlier is also incorrect.
+ // To maintain scoping symmetry, if this line is moved, the corresponding
+ // shutdown call may also need to be moved.
+ MaybeInitializeTaskScheduler();
+
SetupMetrics();
// Initialize FieldTrialSynchronizer system.
@@ -187,6 +245,13 @@ void IOSChromeMainParts::PostMainMessageLoopRun() {
void IOSChromeMainParts::PostDestroyThreads() {
application_context_->PostDestroyThreads();
+
+ // The TaskScheduler was initialized before invoking
+ // |application_context_->PreCreateThreads()|. To maintain scoping symmetry,
+ // perform the shutdown after |application_context_->PostDestroyThreads()|.
+ base::TaskScheduler* task_scheduler = base::TaskScheduler::GetInstance();
+ if (task_scheduler)
+ task_scheduler->Shutdown();
}
// This will be called after the command-line has been mutated by about:flags
« no previous file with comments | « ios/chrome/browser/DEPS ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698