| // Copyright 2013 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "content/renderer/in_process_renderer_thread.h" |
| |
| #include "build/build_config.h" |
| #include "content/public/common/content_client.h" |
| #include "content/public/renderer/content_renderer_client.h" |
| #include "content/renderer/render_process.h" |
| #include "content/renderer/render_process_impl.h" |
| #include "content/renderer/render_thread_impl.h" |
| #include "third_party/blink/public/platform/platform.h" |
| #include "third_party/blink/public/platform/scheduler/web_thread_scheduler.h" |
| |
| #if BUILDFLAG(IS_ANDROID) |
| #include "base/android/jni_android.h" |
| #endif |
| |
| namespace content { |
| |
| InProcessRendererThread::InProcessRendererThread( |
| const InProcessChildThreadParams& params, |
| int32_t renderer_client_id) |
| : Thread("Chrome_InProcRendererThread"), |
| params_(params), |
| renderer_client_id_(renderer_client_id) {} |
| |
| InProcessRendererThread::~InProcessRendererThread() { |
| Stop(); |
| } |
| |
| void InProcessRendererThread::Init() { |
| // In single-process mode, we never enter the sandbox, so run the post-sandbox |
| // code now. |
| content::ContentRendererClient* client = GetContentClient()->renderer(); |
| if (client) { |
| client->PostSandboxInitialized(); |
| } |
| |
| // Call AttachCurrentThreadWithName, before any other AttachCurrentThread() |
| // calls. The latter causes Java VM to assign Thread-??? to the thread name. |
| // Please note calls to AttachCurrentThreadWithName after AttachCurrentThread |
| // will not change the thread name kept in Java VM. |
| #if BUILDFLAG(IS_ANDROID) |
| base::android::AttachCurrentThreadWithName(thread_name()); |
| // Make sure we aren't somehow reinitialising the inprocess renderer thread on |
| // Android. Temporary CHECK() to debug http://crbug.com/514141 |
| CHECK(!render_process_); |
| #endif |
| blink::Platform::InitializeBlink(); |
| std::unique_ptr<blink::scheduler::WebThreadScheduler> main_thread_scheduler = |
| blink::scheduler::WebThreadScheduler::CreateMainThreadScheduler(); |
| |
| render_process_ = RenderProcessImpl::Create(); |
| // RenderThreadImpl doesn't currently support a proper shutdown sequence |
| // and it's okay when we're running in multi-process mode because renderers |
| // get killed by the OS. In-process mode is used for test and debug only. |
| new RenderThreadImpl(params_, renderer_client_id_, |
| std::move(main_thread_scheduler)); |
| } |
| |
| void InProcessRendererThread::CleanUp() { |
| 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); |
| } |
| |
| base::Thread* CreateInProcessRendererThread( |
| const InProcessChildThreadParams& params, |
| int32_t renderer_client_id) { |
| return new InProcessRendererThread(params, renderer_client_id); |
| } |
| |
| } // namespace content |