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的默认构造函数如下:
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创建线程并启动消息循环。