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

Unified Diff: content/browser/browser_main_loop.cc

Issue 19957002: Run the later parts of startup as UI thread tasks (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Run the later parts of startup as UI thread tasks - Jam's nits Created 7 years, 5 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 | « content/browser/browser_main_loop.h ('k') | content/browser/browser_main_runner.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/browser/browser_main_loop.cc
diff --git a/content/browser/browser_main_loop.cc b/content/browser/browser_main_loop.cc
index cc45bc237509b98a2fa1ff4c32d6c8c1a8d319e5..9e02cc4f263f9fc64dd048199cfb7817d7a95d03 100644
--- a/content/browser/browser_main_loop.cc
+++ b/content/browser/browser_main_loop.cc
@@ -34,6 +34,7 @@
#include "content/browser/renderer_host/media/audio_mirroring_manager.h"
#include "content/browser/renderer_host/media/media_stream_manager.h"
#include "content/browser/speech/speech_recognition_manager_impl.h"
+#include "content/browser/startup_task_runner.h"
#include "content/browser/tracing/trace_controller_impl.h"
#include "content/browser/webui/content_web_ui_controller_factory.h"
#include "content/browser/webui/url_data_manager.h"
@@ -60,6 +61,7 @@
#if defined(OS_ANDROID)
#include "base/android/jni_android.h"
+#include "content/browser/android/browser_startup_config.h"
#include "content/browser/android/surface_texture_peer_browser_impl.h"
#endif
@@ -299,7 +301,8 @@ BrowserMainLoop* BrowserMainLoop::GetInstance() {
BrowserMainLoop::BrowserMainLoop(const MainFunctionParams& parameters)
: parameters_(parameters),
parsed_command_line_(parameters.command_line),
- result_code_(RESULT_CODE_NORMAL_EXIT) {
+ result_code_(RESULT_CODE_NORMAL_EXIT),
+ created_threads_(false) {
DCHECK(!g_current_browser_main_loop);
g_current_browser_main_loop = this;
}
@@ -483,8 +486,7 @@ void BrowserMainLoop::MainMessageLoopStart() {
#endif
}
-void BrowserMainLoop::CreateThreads() {
- TRACE_EVENT0("startup", "BrowserMainLoop::CreateThreads")
+int BrowserMainLoop::PreCreateThreads() {
if (parts_) {
TRACE_EVENT0("startup",
@@ -509,9 +511,44 @@ void BrowserMainLoop::CreateThreads() {
if (parsed_command_line_.HasSwitch(switches::kSingleProcess))
RenderProcessHost::SetRunRendererInProcess(true);
#endif
+ return result_code_;
+}
- if (result_code_ > 0)
- return;
+void BrowserMainLoop::CreateStartupTasks() {
+ TRACE_EVENT0("startup", "BrowserMainLoop::CreateStartupTasks")
+
+#if defined(OS_ANDROID)
+ scoped_refptr<StartupTaskRunner> task_runner =
+ new StartupTaskRunner(BrowserMayStartAsynchronously(),
+ base::Bind(&BrowserStartupComplete),
+ base::MessageLoop::current()->message_loop_proxy());
+#else
+ scoped_refptr<StartupTaskRunner> task_runner =
+ new StartupTaskRunner(false,
+ base::Callback<void(int)>(),
+ base::MessageLoop::current()->message_loop_proxy());
+#endif
+ StartupTask pre_create_threads =
+ base::Bind(&BrowserMainLoop::PreCreateThreads, base::Unretained(this));
+ task_runner->AddTask(pre_create_threads);
+
+ StartupTask create_threads =
+ base::Bind(&BrowserMainLoop::CreateThreads, base::Unretained(this));
+ task_runner->AddTask(create_threads);
+
+ StartupTask browser_thread_started = base::Bind(
+ &BrowserMainLoop::BrowserThreadsStarted, base::Unretained(this));
+ task_runner->AddTask(browser_thread_started);
+
+ StartupTask pre_main_message_loop_run = base::Bind(
+ &BrowserMainLoop::PreMainMessageLoopRun, base::Unretained(this));
+ task_runner->AddTask(pre_main_message_loop_run);
+
+ task_runner->StartRunningTasks();
+}
+
+int BrowserMainLoop::CreateThreads() {
+ TRACE_EVENT0("startup", "BrowserMainLoop::CreateThreads");
base::Thread::Options default_options;
base::Thread::Options io_message_loop_options;
@@ -596,14 +633,11 @@ void BrowserMainLoop::CreateThreads() {
TRACE_EVENT_END0("startup", "BrowserMainLoop::CreateThreads:start");
}
+ created_threads_ = true;
+ return result_code_;
+}
-#if !defined(OS_IOS)
- indexed_db_thread_.reset(new base::Thread("IndexedDB"));
- indexed_db_thread_->Start();
-#endif
-
- BrowserThreadsStarted();
-
+int BrowserMainLoop::PreMainMessageLoopRun() {
if (parts_) {
TRACE_EVENT0("startup",
"BrowserMainLoop::CreateThreads:PreMainMessageLoopRun");
@@ -614,6 +648,7 @@ void BrowserMainLoop::CreateThreads() {
// Do not allow disk IO from the UI thread.
base::ThreadRestrictions::SetIOAllowed(false);
base::ThreadRestrictions::DisallowWaiting();
+ return result_code_;
}
void BrowserMainLoop::RunMainMessageLoopParts() {
@@ -630,6 +665,11 @@ void BrowserMainLoop::RunMainMessageLoopParts() {
}
void BrowserMainLoop::ShutdownThreadsAndCleanUp() {
+
+ if (!created_threads_) {
+ // Called early, nothing to do
+ return;
+ }
// Teardown may start in PostMainMessageLoopRun, and during teardown we
// need to be able to perform IO.
base::ThreadRestrictions::SetIOAllowed(true);
@@ -765,8 +805,14 @@ void BrowserMainLoop::InitializeMainThread() {
new BrowserThreadImpl(BrowserThread::UI, base::MessageLoop::current()));
}
-void BrowserMainLoop::BrowserThreadsStarted() {
+int BrowserMainLoop::BrowserThreadsStarted() {
TRACE_EVENT0("startup", "BrowserMainLoop::BrowserThreadsStarted")
+
+#if !defined(OS_IOS)
+ indexed_db_thread_.reset(new base::Thread("IndexedDB"));
+ indexed_db_thread_->Start();
+#endif
+
#if defined(OS_ANDROID)
// Up the priority of anything that touches with display tasks
// (this thread is UI thread, and io_thread_ is for IPCs).
@@ -844,6 +890,7 @@ void BrowserMainLoop::BrowserThreadsStarted() {
CAUSE_FOR_GPU_LAUNCH_BROWSER_STARTUP));
}
#endif // !defined(OS_IOS)
+ return result_code_;
}
void BrowserMainLoop::InitializeToolkit() {
« no previous file with comments | « content/browser/browser_main_loop.h ('k') | content/browser/browser_main_runner.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698