您的位置:首页 > 编程语言

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

2013-05-22 15:21 281 查看
接着看看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创建线程并启动消息循环。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: