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创建线程并启动消息循环。
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创建线程并启动消息循环。
相关文章推荐
- Chrome源代码分析之Renderer进程初始化(十五)
- Chrome源代码分析之Renderer进程初始化(十五)
- Chrome源代码分析之进程和线程模型(三)
- Chrome源代码分析之初始化(七)
- Chrome源代码分析之进程模型(八)
- Chrome源代码分析之socket(五)
- BT源代码学习心得(六):跟踪服务器(Tracker)的代码分析(初始化)
- Android应用程序进程启动过程的源代码分析
- hostapd源代码分析(一):网络接口和BSS的初始化
- Android系统进程Zygote启动过程的源代码分析
- android init 进程分析 (2 初始化流程)
- Android应用程序进程启动过程的源代码分析
- Mozilla Firefox Extension扩展 内幕 教程 源代码分析 安装过程分析(XPInstall,xpcom,rdf,xpi,chrome,manifest)
- nginx代码分析--进程和模块初始化
- Android系统进程Zygote启动过程的源代码分析
- FFmpeg源代码简单分析:常见结构体的初始化和销毁(AVFormatContext,AVFrame等)
- android init 进程分析 (3 初始化脚本)
- 区域函数[置顶] linux 3.4.10 内核内存管理源代码分析5:伙伴系统初始化
- Android应用程序进程启动过程的源代码分析(2)
- Chrome源代码分析之socket(一)