码迷,mamicode.com
首页 > 其他好文 > 详细

chromium的RenderProcess的启动

时间:2014-11-26 16:45:48      阅读:261      评论:0      收藏:0      [点我收藏+]

标签:chromium

RenderProcess与Browser进程中的RenerProcessHost对应,RenderProcess在RenderProcessHostImpl的Init函数中被创建。

Init函数主要进行以下几个工作:

1、建立与RenderProcess进行通信的管道,管道的名称为channel_id。

2、将管道名称channel_id作为子进程启动的参数,调用ChildProcessLauncher启动子进程,子进程可以通过channel_id对应的管道与RenderProcessHost进行通信

3、ChildProcessLauncher经过一系列的调用启动子进程。

  • ChildProcessLauncher实例化一个Context对象context_,调用context_的Launch函数。
  • Launch函数,Post一个Task到PROCESS_LAUNCHER线程,在该线程中执行Context::LaunchInternal
  • LaunchInternal函数,根据是否需要在SandBox中运行子进程,调用LaunchElevatedProcess或者StartSandboxedProcess函数启动子进程
  • 启动的子进程是过程和Browser进程的类似,但是这次它带了参数kProcessType,在执行ContentMainRunner::RunNamedProcessTypeMain的时候进入RenderProcess的主函数RendererMain。

Render进程的入口RendererMain在content/render/render_main.cc,它的初始化过程比较简单,主要有以下几个步骤:

1、初始化主消息循环

base::MessageLoop main_message_loop;
2、初始化RenderProcessImp。

RenderProcessImpl render_process;
3、初始化RenderThreadImpl。

new RenderThreadImpl();
4、运行主消息循环

base::MessageLoop::current()->Run();
MessageLoop、RenderProcessImpl、RenderThreadImpl它们都是便用单例模式的,通过current()接口就能拿到当前线程中的实例。

其中RenderProcessImpl和RenderThreadImpl的关系图如下:

bubuko.com,布布扣

RenderProcessImpl继承自RenderProcess,而RenderProcess继承于ChildProcess,ChildProcess会包含一个用于处理消息的实例ChildThread,ChildThread继承了Sender和Listener接口,可以用于发收和处理接收到的消息,同时ChildProcess还有一个IO线程,用于IO事件的处理,它其实就是ChildThread中管道channel_所使用的IO线程。

RenderProcess接收到的消息首先会调用ChildThread::OnMessageReceived进行处理

一些控制消息会交给RenderThreadImpl::OnControlMessageReceived函数进行处理,比如新建一个RenderView的消息ViewMsg_New,它会接着调用RenderThreadImpl::OnCreateNewView函数完成RenderView的创建。

chromium的RenderProcess的启动

标签:chromium

原文地址:http://blog.csdn.net/ljm198745/article/details/41514581

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!