Chrome源代码分析之Renderer进程初始化续(十六)

接着看看Renderer的入口函数,每个chrome进程的入口函数都是wWinMain,前面以前介绍过,但在ChromeMain函数里面,会根据进程的类型调用不同的进程初始化函数,对于Renderer进程,正确的初始化函数是RendererMain,位于文件 src\chrome\renderer\renderer_main.cc 里面。


Renderer进程的初始化类似于browser进程,也是要创建一个代表进程的对象:RenderProcessImpl render_process;,一个表示主线程的对象:main_thread_,

该对象是RenderProcessImpl的一个成员。通过下面语句实现:

render_process.set_main_thread(new RenderThread());

RenderProcessImpl继承自RenderProcess,RenderProcess又继承自ChildProcess,他有2个重要的成员,主线程对象和io线程对象。




现在看看main_thread_的初始化,main_thread_是一个RenderThread的对象,在上面那一段代码中,通过new一个RenderThread类的对象,在RenderThread的默认构造函数中完成了初始化的过程

RenderThread的默认构造函数如下:

RenderThread::RenderThread() {
  Init();
}

在Init();函数中初始化了所有的成员变量。接着看看父类ChildThread的默认构造函数,代码如下:

ChildThread::ChildThread() {
  channel_name_ = CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
      switches::kProcessChannelID);
  Init();
}

先是通过获取用于IPC的管道名,即channel_name_,CommandLine::ForCurrentProcess()可以取得当前进程的命令行对象,这是由于在wWinMain里面就通过调用 CommandLine::Init(0, NULL)初始化了命令行对象,并通过调用current_process_commandline_->ParseFromString(::GetCommandLineW());将在browser进程里面初始化renderer过程中写入的命令保存到了current_process_commandline_对象里面,此代码位于 src\base\command_line.cc.


接着会调用ChildThread的Init(),这里最重要的是初始化消息循环对象,调用的是message_loop_ = MessageLoop::current();因为在初始化RenderProcessImpl对象之前已经创建了消息循环对象并设置了本地线程TLS,因此这里调用current()就能获得刚才保存的MessageLoop的指针。


以及初始化IPC对象,调用的是

  channel_.reset(new IPC::SyncChannel(channel_name_,
      IPC::Channel::MODE_CLIENT, this, NULL,
      ChildProcess::current()->io_message_loop(), true,
      ChildProcess::current()->GetShutDownEvent()));

另外还会初始化ResourceDispatcher对象和IPC过滤对象。


再看看render_process的默认构造函数,主要是为webkit而做的一切初始化工作,这里就不详细分析了。而祖父类ChildProcess的默认构造函数则主要是为了初始化和启动Io函数,代码位于 src\chrome\common\child_process.cc:

ChildProcess::ChildProcess()
    : ref_count_(0),
      shutdown_event_(true, false),
      io_thread_("Chrome_ChildIOThread") {
  DCHECK(!child_process_);
  child_process_ = this;


  io_thread_.StartWithOptions(base::Thread::Options(MessageLoop::TYPE_IO, 0));
}

主要功能即设定线程的类型为TYPE_IO,并调用StartWithOptions创建线程并启动消息循环。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值