summaryrefslogtreecommitdiffstats
path: root/content/browser/startup_task_runner.cc
diff options
context:
space:
mode:
authoraberent@chromium.org <aberent@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-08-01 16:01:51 +0000
committeraberent@chromium.org <aberent@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-08-01 16:01:51 +0000
commit57624abcbe3852fe2492ea0257fd92f400c4c5ce (patch)
tree8947ba6272e9b13103304285b5faf76a60593601 /content/browser/startup_task_runner.cc
parent9562f40f00dab5117a37553b712f902d2ddf5417 (diff)
downloadchromium_src-57624abcbe3852fe2492ea0257fd92f400c4c5ce.zip
chromium_src-57624abcbe3852fe2492ea0257fd92f400c4c5ce.tar.gz
chromium_src-57624abcbe3852fe2492ea0257fd92f400c4c5ce.tar.bz2
Run the later parts of startup as UI thread tasks
This CL splits the later parts of startup, from thread creation onwards, into multiple UI thread tasks. Depending on the StartupTaskRunner passed to CreateThreads the tasks are all run immediately, or are queued one at a time on the UI thread. This, on platforms where the UI is already running, allows the UI to remain interactive while Chrome is initialized. BUG=231856 Review URL: https://chromiumcodereview.appspot.com/19957002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@215042 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content/browser/startup_task_runner.cc')
-rw-r--r--content/browser/startup_task_runner.cc63
1 files changed, 63 insertions, 0 deletions
diff --git a/content/browser/startup_task_runner.cc b/content/browser/startup_task_runner.cc
new file mode 100644
index 0000000..a7e730e
--- /dev/null
+++ b/content/browser/startup_task_runner.cc
@@ -0,0 +1,63 @@
+// Copyright 2013 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 "content/browser/startup_task_runner.h"
+
+#include "base/bind.h"
+#include "base/location.h"
+#include "base/message_loop/message_loop.h"
+
+namespace content {
+
+StartupTaskRunner::StartupTaskRunner(
+ bool browser_may_start_asynchronously,
+ base::Callback<void(int)> const startup_complete_callback,
+ scoped_refptr<base::SingleThreadTaskRunner> proxy)
+ : asynchronous_startup_(browser_may_start_asynchronously),
+ startup_complete_callback_(startup_complete_callback),
+ proxy_(proxy) {}
+
+void StartupTaskRunner::AddTask(StartupTask& callback) {
+ task_list_.push_back(callback);
+}
+
+void StartupTaskRunner::StartRunningTasks() {
+ DCHECK(proxy_);
+ int result = 0;
+ if (asynchronous_startup_ && !task_list_.empty()) {
+ const base::Closure next_task =
+ base::Bind(&StartupTaskRunner::WrappedTask, this);
+ proxy_->PostNonNestableTask(FROM_HERE, next_task);
+ } else {
+ for (std::list<StartupTask>::iterator it = task_list_.begin();
+ it != task_list_.end();
+ it++) {
+ result = it->Run();
+ if (result > 0) {
+ break;
+ }
+ }
+ if (!startup_complete_callback_.is_null()) {
+ startup_complete_callback_.Run(result);
+ }
+ }
+}
+
+void StartupTaskRunner::WrappedTask() {
+ int result = task_list_.front().Run();
+ task_list_.pop_front();
+ if (result > 0 || task_list_.empty()) {
+ if (!startup_complete_callback_.is_null()) {
+ startup_complete_callback_.Run(result);
+ }
+ } else {
+ const base::Closure next_task =
+ base::Bind(&StartupTaskRunner::WrappedTask, this);
+ proxy_->PostNonNestableTask(FROM_HERE, next_task);
+ }
+}
+
+StartupTaskRunner::~StartupTaskRunner() {}
+
+} // namespace content