diff options
author | aberent@chromium.org <aberent@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-08-01 16:01:51 +0000 |
---|---|---|
committer | aberent@chromium.org <aberent@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-08-01 16:01:51 +0000 |
commit | 57624abcbe3852fe2492ea0257fd92f400c4c5ce (patch) | |
tree | 8947ba6272e9b13103304285b5faf76a60593601 /content/browser/startup_task_runner.cc | |
parent | 9562f40f00dab5117a37553b712f902d2ddf5417 (diff) | |
download | chromium_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.cc | 63 |
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 |