| Index: content/browser/renderer_host/render_process_host_impl.cc
|
| diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc
|
| index e31aff2afc603254eaae7dec5e96bbaf6ec40008..302ab16d2bbceef07fd0bdda820e6373794db432 100644
|
| --- a/content/browser/renderer_host/render_process_host_impl.cc
|
| +++ b/content/browser/renderer_host/render_process_host_impl.cc
|
| @@ -118,8 +118,6 @@
|
| #include "content/public/common/process_type.h"
|
| #include "content/public/common/result_codes.h"
|
| #include "content/public/common/url_constants.h"
|
| -#include "content/renderer/render_process_impl.h"
|
| -#include "content/renderer/render_thread_impl.h"
|
| #include "gpu/command_buffer/service/gpu_switches.h"
|
| #include "ipc/ipc_channel.h"
|
| #include "ipc/ipc_logging.h"
|
| @@ -157,8 +155,6 @@ static const char* kSiteProcessMapKeyName = "content_site_process_map";
|
| namespace content {
|
| namespace {
|
|
|
| -base::MessageLoop* g_in_process_thread;
|
| -
|
| void CacheShaderInfo(int32 id, base::FilePath path) {
|
| ShaderCacheFactory::GetInstance()->SetCacheInfo(id, path);
|
| }
|
| @@ -167,57 +163,6 @@ void RemoveShaderInfo(int32 id) {
|
| ShaderCacheFactory::GetInstance()->RemoveCacheInfo(id);
|
| }
|
|
|
| -} // namespace
|
| -
|
| -#if !defined(CHROME_MULTIPLE_DLL)
|
| -
|
| -// This class creates the IO thread for the renderer when running in
|
| -// single-process mode. It's not used in multi-process mode.
|
| -class RendererMainThread : public base::Thread {
|
| - public:
|
| - explicit RendererMainThread(const std::string& channel_id)
|
| - : Thread("Chrome_InProcRendererThread"),
|
| - channel_id_(channel_id) {
|
| - }
|
| -
|
| - virtual ~RendererMainThread() {
|
| - Stop();
|
| - }
|
| -
|
| - protected:
|
| - virtual void Init() OVERRIDE {
|
| - render_process_.reset(new RenderProcessImpl());
|
| - new RenderThreadImpl(channel_id_);
|
| - g_in_process_thread = message_loop();
|
| - }
|
| -
|
| - virtual void CleanUp() OVERRIDE {
|
| - g_in_process_thread = NULL;
|
| - render_process_.reset();
|
| -
|
| - // It's a little lame to manually set this flag. But the single process
|
| - // RendererThread will receive the WM_QUIT. We don't need to assert on
|
| - // this thread, so just force the flag manually.
|
| - // If we want to avoid this, we could create the InProcRendererThread
|
| - // directly with _beginthreadex() rather than using the Thread class.
|
| - // We used to set this flag in the Init function above. However there
|
| - // other threads like WebThread which are created by this thread
|
| - // which resets this flag. Please see Thread::StartWithOptions. Setting
|
| - // this flag to true in Cleanup works around these problems.
|
| - SetThreadWasQuitProperly(true);
|
| - }
|
| -
|
| - private:
|
| - std::string channel_id_;
|
| - scoped_ptr<RenderProcess> render_process_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(RendererMainThread);
|
| -};
|
| -
|
| -#endif
|
| -
|
| -namespace {
|
| -
|
| // Helper class that we pass to ResourceMessageFilter so that it can find the
|
| // right net::URLRequestContext for a request.
|
| class RendererURLRequestContextSelector
|
| @@ -339,6 +284,20 @@ class RendererSandboxedProcessLauncherDelegate
|
|
|
| } // namespace
|
|
|
| +RendererMainThreadFactoryFunction g_renderer_main_thread_factory = NULL;
|
| +
|
| +void RenderProcessHost::RegisterRendererMainThreadFactory(
|
| + RendererMainThreadFactoryFunction create) {
|
| + g_renderer_main_thread_factory = create;
|
| +}
|
| +
|
| +base::MessageLoop* g_in_process_thread;
|
| +
|
| +base::MessageLoop*
|
| + RenderProcessHostImpl::GetInProcessRendererThreadForTesting() {
|
| + return g_in_process_thread;
|
| +}
|
| +
|
| // Stores the maximum number of renderer processes the content module can
|
| // create.
|
| static size_t g_max_renderer_count_override = 0;
|
| @@ -511,15 +470,14 @@ bool RenderProcessHostImpl::Init() {
|
| CreateMessageFilters();
|
|
|
| // Single-process mode not supported in multiple-dll mode currently.
|
| -#if !defined(CHROME_MULTIPLE_DLL)
|
| - if (run_renderer_in_process()) {
|
| + if (run_renderer_in_process() && g_renderer_main_thread_factory) {
|
| // Crank up a thread and run the initialization there. With the way that
|
| // messages flow between the browser and renderer, this thread is required
|
| // to prevent a deadlock in single-process mode. Since the primordial
|
| // thread in the renderer process runs the WebKit code and can sometimes
|
| // make blocking calls to the UI thread (i.e. this thread), they need to run
|
| // on separate threads.
|
| - in_process_renderer_.reset(new RendererMainThread(channel_id));
|
| + in_process_renderer_.reset(g_renderer_main_thread_factory(channel_id));
|
|
|
| base::Thread::Options options;
|
| #if defined(OS_WIN) && !defined(OS_MACOSX)
|
| @@ -532,10 +490,10 @@ bool RenderProcessHostImpl::Init() {
|
| #endif
|
| in_process_renderer_->StartWithOptions(options);
|
|
|
| + g_in_process_thread = in_process_renderer_->message_loop();
|
| +
|
| OnProcessLaunched(); // Fake a callback that the process is ready.
|
| - } else
|
| -#endif // !CHROME_MULTIPLE_DLL
|
| - {
|
| + } else {
|
| // Build command line for renderer. We call AppendRendererCommandLine()
|
| // first so the process type argument will appear first.
|
| CommandLine* cmd_line = new CommandLine(renderer_path);
|
| @@ -1614,11 +1572,6 @@ void RenderProcessHostImpl::RegisterProcessHostForSite(
|
| map->RegisterProcess(site, process);
|
| }
|
|
|
| -base::MessageLoop*
|
| - RenderProcessHostImpl::GetInProcessRendererThreadForTesting() {
|
| - return g_in_process_thread;
|
| -}
|
| -
|
| void RenderProcessHostImpl::ProcessDied(bool already_dead) {
|
| // Our child process has died. If we didn't expect it, it's a crash.
|
| // In any case, we need to let everyone know it's gone.
|
|
|