diff options
Diffstat (limited to 'content/browser/utility_process_host_impl.cc')
-rw-r--r-- | content/browser/utility_process_host_impl.cc | 64 |
1 files changed, 10 insertions, 54 deletions
diff --git a/content/browser/utility_process_host_impl.cc b/content/browser/utility_process_host_impl.cc index 2e56218..766b82e 100644 --- a/content/browser/utility_process_host_impl.cc +++ b/content/browser/utility_process_host_impl.cc @@ -16,7 +16,6 @@ #include "base/synchronization/waitable_event.h" #include "content/browser/browser_child_process_host_impl.h" #include "content/browser/renderer_host/render_process_host_impl.h" -#include "content/child/child_process.h" #include "content/common/child_process_host_impl.h" #include "content/common/utility_messages.h" #include "content/public/browser/browser_thread.h" @@ -24,7 +23,6 @@ #include "content/public/browser/utility_process_host_client.h" #include "content/public/common/content_switches.h" #include "content/public/common/process_type.h" -#include "content/utility/utility_thread_impl.h" #include "ipc/ipc_switches.h" #include "ui/base/ui_base_switches.h" @@ -53,53 +51,8 @@ private: }; #endif -// We want to ensure there's only one utility thread running at a time, as there -// are many globals used in the utility process. -static base::LazyInstance<base::Lock> g_one_utility_thread_lock; -// Single process not supported in multiple dll mode currently. -#if !defined(CHROME_MULTIPLE_DLL) -class UtilityMainThread : public base::Thread { - public: - UtilityMainThread(const std::string& channel_id) - : Thread("Chrome_InProcUtilityThread"), - channel_id_(channel_id) { - } - - virtual ~UtilityMainThread() { - Stop(); - } - - private: - // base::Thread implementation: - virtual void Init() OVERRIDE { - // We need to return right away or else the main thread that started us will - // hang. - base::MessageLoop::current()->PostTask( - FROM_HERE, - base::Bind(&UtilityMainThread::InitInternal, base::Unretained(this))); - } - - virtual void CleanUp() OVERRIDE { - child_process_.reset(); - - // See comment in RendererMainThread. - SetThreadWasQuitProperly(true); - g_one_utility_thread_lock.Get().Release(); - } - - void InitInternal() { - g_one_utility_thread_lock.Get().Acquire(); - child_process_.reset(new ChildProcess()); - child_process_->set_main_thread(new UtilityThreadImpl(channel_id_)); - } - - std::string channel_id_; - scoped_ptr<ChildProcess> child_process_; - - DISALLOW_COPY_AND_ASSIGN(UtilityMainThread); -}; -#endif // !CHROME_MULTIPLE_DLL +UtilityMainThreadFactoryFunction g_utility_main_thread_factory = NULL; UtilityProcessHost* UtilityProcessHost::Create( UtilityProcessHostClient* client, @@ -107,6 +60,11 @@ UtilityProcessHost* UtilityProcessHost::Create( return new UtilityProcessHostImpl(client, client_task_runner); } +void UtilityProcessHost::RegisterUtilityMainThreadFactory( + UtilityMainThreadFactoryFunction create) { + g_utility_main_thread_factory = create; +} + UtilityProcessHostImpl::UtilityProcessHostImpl( UtilityProcessHostClient* client, base::SequencedTaskRunner* client_task_runner) @@ -196,15 +154,13 @@ bool UtilityProcessHostImpl::StartProcess() { return false; // Single process not supported in multiple dll mode currently. -#if !defined(CHROME_MULTIPLE_DLL) - if (RenderProcessHost::run_renderer_in_process()) { + if (RenderProcessHost::run_renderer_in_process() && + g_utility_main_thread_factory) { // See comment in RenderProcessHostImpl::Init() for the background on why we // support single process mode this way. - in_process_thread_.reset(new UtilityMainThread(channel_id)); + in_process_thread_.reset(g_utility_main_thread_factory(channel_id)); in_process_thread_->Start(); - } else -#endif // !CHROME_MULTIPLE_DLL - { + } else { const CommandLine& browser_command_line = *CommandLine::ForCurrentProcess(); int child_flags = child_flags_; |