| Index: content/browser/browser_main_loop.cc
|
| ===================================================================
|
| --- content/browser/browser_main_loop.cc (revision 111697)
|
| +++ content/browser/browser_main_loop.cc (working copy)
|
| @@ -16,7 +16,6 @@
|
| #include "content/common/hi_res_timer_manager.h"
|
| #include "content/common/sandbox_policy.h"
|
| #include "content/public/browser/browser_main_parts.h"
|
| -#include "content/public/browser/browser_shutdown.h"
|
| #include "content/public/browser/content_browser_client.h"
|
| #include "content/public/common/content_switches.h"
|
| #include "content/public/common/main_function_params.h"
|
| @@ -146,50 +145,19 @@
|
|
|
| namespace content {
|
|
|
| -// The currently-running BrowserMainLoop. There can be one or zero.
|
| -// This is stored to enable immediate shutdown when needed.
|
| -BrowserMainLoop* current_browser_main_loop = NULL;
|
|
|
| -// This is just to be able to keep ShutdownThreadsAndCleanUp out of
|
| -// the public interface of BrowserMainLoop.
|
| -class BrowserShutdownImpl {
|
| - public:
|
| - static void ImmediateShutdownAndExitProcess() {
|
| - DCHECK(current_browser_main_loop);
|
| - current_browser_main_loop->ShutdownThreadsAndCleanUp();
|
| -
|
| -#if defined(OS_WIN)
|
| - // At this point the message loop is still running yet we've shut everything
|
| - // down. If any messages are processed we'll likely crash. Exit now.
|
| - ExitProcess(content::RESULT_CODE_NORMAL_EXIT);
|
| -#elif defined(OS_POSIX) && !defined(OS_MACOSX)
|
| - _exit(content::RESULT_CODE_NORMAL_EXIT);
|
| -#else
|
| - NOTIMPLEMENTED();
|
| -#endif
|
| - }
|
| -};
|
| -
|
| -void ImmediateShutdownAndExitProcess() {
|
| - BrowserShutdownImpl::ImmediateShutdownAndExitProcess();
|
| -}
|
| -
|
| // BrowserMainLoop construction / destructione =============================
|
|
|
| BrowserMainLoop::BrowserMainLoop(const content::MainFunctionParams& parameters)
|
| : parameters_(parameters),
|
| parsed_command_line_(parameters.command_line),
|
| result_code_(content::RESULT_CODE_NORMAL_EXIT) {
|
| - DCHECK(!current_browser_main_loop);
|
| - current_browser_main_loop = this;
|
| #if defined(OS_WIN)
|
| OleInitialize(NULL);
|
| #endif
|
| }
|
|
|
| BrowserMainLoop::~BrowserMainLoop() {
|
| - DCHECK_EQ(this, current_browser_main_loop);
|
| - current_browser_main_loop = NULL;
|
| #if defined(OS_WIN)
|
| OleUninitialize();
|
| #endif
|
| @@ -294,85 +262,6 @@
|
| void BrowserMainLoop::RunMainMessageLoopParts(
|
| bool* completed_main_message_loop) {
|
| if (parts_.get())
|
| - parts_->PreCreateThreads();
|
| -
|
| - base::Thread::Options default_options;
|
| - base::Thread::Options io_message_loop_options;
|
| - io_message_loop_options.message_loop_type = MessageLoop::TYPE_IO;
|
| - base::Thread::Options ui_message_loop_options;
|
| - ui_message_loop_options.message_loop_type = MessageLoop::TYPE_UI;
|
| -
|
| - // Start threads in the order they occur in the BrowserThread::ID
|
| - // enumeration, except for BrowserThread::UI which is the main
|
| - // thread.
|
| - //
|
| - // Must be size_t so we can increment it.
|
| - for (size_t thread_id = BrowserThread::UI + 1;
|
| - thread_id < BrowserThread::ID_COUNT;
|
| - ++thread_id) {
|
| - scoped_ptr<BrowserProcessSubThread>* thread_to_start = NULL;
|
| - base::Thread::Options* options = &default_options;
|
| -
|
| - switch (thread_id) {
|
| - case BrowserThread::DB:
|
| - thread_to_start = &db_thread_;
|
| - break;
|
| - case BrowserThread::WEBKIT:
|
| - // For now, the WebKit thread in the browser is owned by
|
| - // ResourceDispatcherHost, not by the content framework. Until
|
| - // this is fixed, we don't start the thread but still call
|
| - // Pre/PostStartThread for the ID.
|
| - break;
|
| - case BrowserThread::FILE:
|
| - thread_to_start = &file_thread_;
|
| -#if defined(OS_WIN)
|
| - // On Windows, the FILE thread needs to be have a UI message loop
|
| - // which pumps messages in such a way that Google Update can
|
| - // communicate back to us.
|
| - options = &ui_message_loop_options;
|
| -#else
|
| - options = &io_message_loop_options;
|
| -#endif
|
| - break;
|
| - case BrowserThread::PROCESS_LAUNCHER:
|
| - thread_to_start = &process_launcher_thread_;
|
| - break;
|
| - case BrowserThread::CACHE:
|
| - thread_to_start = &cache_thread_;
|
| - options = &io_message_loop_options;
|
| - break;
|
| - case BrowserThread::IO:
|
| - thread_to_start = &io_thread_;
|
| - options = &io_message_loop_options;
|
| - break;
|
| -#if defined(OS_CHROMEOS)
|
| - case BrowserThread::WEB_SOCKET_PROXY:
|
| - thread_to_start = &web_socket_proxy_thread_;
|
| - options = &io_message_loop_options;
|
| - break;
|
| -#endif
|
| - case BrowserThread::UI:
|
| - case BrowserThread::ID_COUNT:
|
| - default:
|
| - NOTREACHED();
|
| - break;
|
| - }
|
| -
|
| - BrowserThread::ID id = static_cast<BrowserThread::ID>(thread_id);
|
| -
|
| - if (parts_.get())
|
| - parts_->PreStartThread(id);
|
| -
|
| - if (thread_to_start) {
|
| - (*thread_to_start).reset(new BrowserProcessSubThread(id));
|
| - (*thread_to_start)->StartWithOptions(*options);
|
| - }
|
| -
|
| - if (parts_.get())
|
| - parts_->PostStartThread(id);
|
| - }
|
| -
|
| - if (parts_.get())
|
| parts_->PreMainMessageLoopRun();
|
|
|
| TRACE_EVENT_BEGIN_ETW("BrowserMain:MESSAGE_LOOP", 0, "");
|
| @@ -392,96 +281,8 @@
|
| if (completed_main_message_loop)
|
| *completed_main_message_loop = true;
|
|
|
| - ShutdownThreadsAndCleanUp();
|
| -}
|
| -
|
| -void BrowserMainLoop::ShutdownThreadsAndCleanUp() {
|
| - // Teardown may start in PostMainMessageLoopRun, and during teardown we
|
| - // need to be able to perform IO.
|
| - base::ThreadRestrictions::SetIOAllowed(true);
|
| - BrowserThread::PostTask(
|
| - BrowserThread::IO,
|
| - FROM_HERE,
|
| - NewRunnableFunction(&base::ThreadRestrictions::SetIOAllowed, true));
|
| -
|
| if (parts_.get())
|
| parts_->PostMainMessageLoopRun();
|
| -
|
| - // Must be size_t so we can subtract from it.
|
| - for (size_t thread_id = BrowserThread::ID_COUNT - 1;
|
| - thread_id >= (BrowserThread::UI + 1);
|
| - --thread_id) {
|
| - // Find the thread object we want to stop. Looping over all valid
|
| - // BrowserThread IDs and DCHECKing on a missing case in the switch
|
| - // statement helps avoid a mismatch between this code and the
|
| - // BrowserThread::ID enumeration.
|
| - //
|
| - // The destruction order is the reverse order of occurrence in the
|
| - // BrowserThread::ID list. The rationale for the order is as
|
| - // follows (need to be filled in a bit):
|
| - //
|
| - // - (Not sure why the WEB_SOCKET_PROXY thread is stopped first.)
|
| - //
|
| - // - The IO thread is the only user of the CACHE thread.
|
| - //
|
| - // - The PROCESS_LAUNCHER thread must be stopped after IO in case
|
| - // the IO thread posted a task to terminate a process on the
|
| - // process launcher thread.
|
| - //
|
| - // - (Not sure why FILE needs to stop before WEBKIT.)
|
| - //
|
| - // - The WEBKIT thread (which currently is the responsibility of
|
| - // the embedder to stop, by destroying ResourceDispatcherHost
|
| - // before the DB thread is stopped)
|
| - //
|
| - // - (Not sure why DB stops last.)
|
| - scoped_ptr<BrowserProcessSubThread>* thread_to_stop = NULL;
|
| - switch (thread_id) {
|
| - case BrowserThread::DB:
|
| - thread_to_stop = &db_thread_;
|
| - break;
|
| - case BrowserThread::WEBKIT:
|
| - // For now, the WebKit thread in the browser is owned by
|
| - // ResourceDispatcherHost, not by the content framework. Until
|
| - // this is fixed, we don't stop the thread but still call
|
| - // Pre/PostStopThread for the ID.
|
| - break;
|
| - case BrowserThread::FILE:
|
| - thread_to_stop = &file_thread_;
|
| - break;
|
| - case BrowserThread::PROCESS_LAUNCHER:
|
| - thread_to_stop = &process_launcher_thread_;
|
| - break;
|
| - case BrowserThread::CACHE:
|
| - thread_to_stop = &cache_thread_;
|
| - break;
|
| - case BrowserThread::IO:
|
| - thread_to_stop = &io_thread_;
|
| - break;
|
| -#if defined(OS_CHROMEOS)
|
| - case BrowserThread::WEB_SOCKET_PROXY:
|
| - thread_to_stop = &web_socket_proxy_thread_;
|
| - break;
|
| -#endif
|
| - case BrowserThread::UI:
|
| - case BrowserThread::ID_COUNT:
|
| - default:
|
| - NOTREACHED();
|
| - break;
|
| - }
|
| -
|
| - BrowserThread::ID id = static_cast<BrowserThread::ID>(thread_id);
|
| -
|
| - if (parts_.get())
|
| - parts_->PreStopThread(id);
|
| - if (thread_to_stop)
|
| - thread_to_stop->reset();
|
| - if (parts_.get())
|
| - parts_->PostStopThread(id);
|
| - }
|
| -
|
| - if (parts_.get())
|
| - parts_->PostDestroyThreads();
|
| }
|
|
|
| void BrowserMainLoop::InitializeMainThread() {
|
|
|