文档

base/callback.h中注释

作用

参数传递与函数调用分离,可异步调用 task包装callback通过message传递给另一线程执行

功能

callback本质上是对函数指针的封装,bind是把成员函数,函数等转化成callback对象。

关键对象

BindState<>由bind创建,callback保持。

产生

bind系列和callback系列都是由pump.py通过xxx.x.pump生成的。

限制

bind最多支持7个参数的函数转换。 类成员函数指针

class C;
class C {
public:
    void print(int x) {
        printf("%d\n", x);
    };
    int add(int x, int y) {
        return (x + y);
    };
};
int
main(int argc, char* argv[])
{
    C c;
    C* pc = new C();
    int (C::*add)(int,int);
    typedef void (C::*PF)(int);
    PF print = &C::print;
    add = 0;
    add = &C::add;
    int i = (c.*add)(5,6);
    (pc->*print)(i);
    return 0;
}

标签: chromium
日期: 2014-08-08 17:30:06, 10 years and 161 days ago

原文inter process communication

实现

  • windows采用命名管道
  • linux/x os 采用socketpair()
  • browser process中 I/O thread处理消息避免UI thread阻塞;view通过ChannelProxy进行消息的收发,ChannelProxy::MessageFilter 插入RenderProcessHost用于过滤资源请求类消息在I/O thread中处理
  • render process中 main render thread用于处理browser和webkit的通信,并提供同步通信机制

    消息类型

  • control message - 直接由View/ViewHost处理

  • routed message - 由View派发给注册routed的对象处理
  • View message - 发送给RenderView的消息
  • ViewHost message - 发送给RenderViewHost的消息
  • PluginProcess - message browser process发送给plugin process的消息
  • PluginProcessHost - plugin process发送给browser process的消息

    消息声明

  • 文件 rendermessagesinternal.h

IPC_MESSAGE_ROUTED2(ViewHostMsg_MyMessage, GURL, int)
IPC_MESSAGE_CONTROL0(ViewMsg_MyMessage)
  • 参数太多则可以使用结构体包装
Send(new ViewMsg_StopFinding(routing-id));

处理消息

MyClass::OnMessageReceived(const IPC::Message& message) {
  IPC_BEGIN_MESSAGE_MAP(MyClass, message)
    // Will call OnMyMessage with the message. The parameters of the message will be unpacked for you.
    IPC_MESSAGE_HANDLER(ViewHostMsg_MyMessage, OnMyMessage)  
    ...
    IPC_MESSAGE_UNHANDLED_ERROR()  // This will throw an exception for unhandled messages.
  IPC_END_MESSAGE_MAP()
}

// This function will be called with the parameters extracted from the ViewHostMsg_MyMessage message.
MyClass::OnMyMessage(const GURL& url, int something) {
  ...
}

同步消息

IPC::SyncMessage 阻塞进程直到返回

/* 声明 */
IPC_SYNC_MESSAGE_CONTROL2_1(SomeMessage,  // Message name
                            GURL, //input_param1
                            int, //input_param2
                            std::string); //result
/* 处理 */
IPC_MESSAGE_HANDLER(MyMessage, OnMyMessage)
to the OnMessageReceived function, and write:
void RenderProcessHost::OnMyMessage(GURL input_param, std::string* result) {
  *result = input_param.spec() + " is not available";
}
标签: chromium
日期: 2014-08-01 17:30:06, 10 years and 168 days ago

原文process models 网站更像一个应用而不是文档,所以浏览器要向操作系统一样有更高的安全性和鲁棒性。

进程模型

  • 每个网站的一个实例对应一个进程 默认
  • 每个网站对应一个进程 --process-per-site
  • 每个tab页对应一个进程 --process-per-tab
  • 单进程模型 --single-process
  • 渲染进程运行在沙箱内
  • 每个插件单独一个进程
  • 网页跳转不能切换进程(将来会改进)
  • 网页的frame在同一进程中(将来会改进)
  • 进程数有限制
标签: chromium
日期: 2014-07-23 17:30:06, 10 years and 177 days ago

原文display a web page in chrome

  • Browser
    • 代码位置:src/chrome/browser
  • Tab contents
    • 代码位置:src/chrome/browser/tab_content
  • Render host
    • 代码位置:src/chrome/browser/renderer_host
  • Render
    • src/chrome/rendererer
    • RenderView
    • 代码位置:/content/render/renderviewimpl.cc
    • 继承于RenderWidget,RenderWidget负责input处理和绘制
  • Webkit glue(WebView, WebWidget, WebFrame, etc)
    • 代码位置:src/webkit/glue
    • 封装webkit接口
    • 转化webkit内建类型为chromium类型,如,std::string 代替 WebCore::String;GURL代替KURL。
    • 简化webkit对象命名,如:WebCore::Frame 变成 WebFrame
    • test shell基于glue的测试程序
  • Webkit/Webkit Port
    • 代码位置:third_party/Webkit
    • webkit开源代码,Port是webcore平台相关接口的实现
  1. browser process的UI thread创建RenderProcessHost
  2. RenderProcessHost创建render process并在browser process的I/O thread中创建ChannelProxy
  3. ChannelProxy监听命名管道,将消息转发给RenderProcessHost
  4. ChannelProxy中包含ResourceMessageFilter过滤某些消息(如网络通信)直接交给I/O thread 处理
    • ResourceMessageFilter::OnMessageReceived()
  5. RenderProcessHost将view相关消息派发给RenderViewHost处理,本身处理view无关消息
    • RenderProcessHost::OnMessageReceived()
  6. view相关消息在RenderViewHost和RenderWidgetHostView基类中处理
  7. RenderView(Widget)Host都有与之对应的RenderView(Widget)位于render process,
  8. 每个平台都有一个 (RenderWidgetHostView[Aura|Gtk|Mac|Win])用于集成至平台。
  render process                               browser process
       |                                            |
    +--+--------------+                +---------------------+
    |                  \              /                       \
render thread        main thread    I/O(IPC) thread     Main browser(UI) thread
    |                    |            |                         |
 webkit                  |            |                         |
    |                    |            |                         |
renderWidget::SetCursor  |            |                         |
    |                    |            |                         |
renderView::Send()       |            |                         |
    |                    |            |                         |
RenderThead::Send()      |            |                         |
    |            IPC::SyncChannel     |                         |
    |                    |-----IPC----|                         |
    |                    |      IPC::ChannelProxy               |
    |                    |            |                         |
    |                    | ResourceMessageFilter                |
    |                    |            |                         |
    |                    |            |   RenderProcessHost::OnMessageReceived
    |                    |            |                         |
    |                    |            |    RenderViewHost::OnMessageReceived
    |                    |            |                         |
    |                    |            |     RenderViewHost::OnMessageReceived
    |                    |            |                         |
    |                    |            |     RenderWidgetHost::OnMsgSetCursor 
    |                    |            |                         |
  render process                               browser process
       |                                            |
    +--+------------------------+                +---------------------+
    |                            \              /                       \
render thread                 main thread    I/O(IPC) thread     Main browser(UI) thread
    |                             |            |                         |
    |                             |            | RenderWidgetHost:ForwardMouseEventToRenderer
    |                             |            |                         |
    |                             |            |                   WebMouseEvent 
    |                             |            |                         |
    |                             |            | RenderWidgetHost::ForwardInputEvent
    |                             |            |                         |
    |                             |            |          RenderWidgetHost::Send
    |                             |      IPC::ChannelProxy               |
    |                             |----IPC-----|                         |
    |                         IPC::Channel     |                         |
RenderView::OnMessageReceived     |            |                         |
    |                             |            |                         |
RenderViewHost::OnMessageReceived |            |                         |
    |                             |            |                         |
RenderWidgetHost::OnMsgSetCursor  |            |                         |
    |                             |            |                         |
标签: chromium
日期: 2014-07-18 17:30:06, 10 years and 182 days ago

原文multi-process

需求

浏览器绝不可能不崩溃,也没有绝对的安全。 所以,为了像现代操作系统一样具有更强的鲁棒性,chromium采取多进程架构。

进程

  • browser为主进程用于UI,管理tab页和插件进程。
  • render为tab-specific进程用webkit(开源布局引擎)解释和布局HTML。
  • browser为render的父进程
  • 进程间采用Chromium's IPC system通信
+---------------browser--------------+ +----------render------------+
|RenderProcessHost+---RenderViewHost-|-|-RenderView--+-RenderProcess|
|                  \                 | |            /               |
|                   +-RenderViewHost-|-|-RenderView/                |
|                                    | +----------------------------+
|                                    | + ----------render-----------+
|RenderProcessHost----RenderViewHost-|-|-RenderView---RenderProcess |
+------------------------------------+ +----------------------------+
  • browser拥有多个RenderProcessHost用于保存状态和与render进行通信。
  • 每个render进程拥有一个RenderProcess用于保存状态和与browser进程进行中相应的RenderProcessHost通信。
  • 每个render进程有一个或多个RenderView,每个RenderView相当于一个tab。在同一个render中 view被给予一个唯一的ID用于与其他view进行区别,但是对于browser,view的ID并不唯一。
  • 每个RenderView通过其render对应的RenderProcessHost和ID与browser进行通信
  • 多tab或windows共享一个进程,如javascript的window.open打开一个新窗口需要同步操作。
  • browser监控render,对于render崩溃和异常进行容错处理
  • webkit运行于多进程模型中,可以严格限制对系统资源的访问。例如访问网络通过父进程,通过操作系统内置权限限制对文件系统的访问。
  • tab不显示的时候,browser可以回收其内存
标签: chromium
日期: 2014-07-11 17:30:06, 10 years and 189 days ago