Chromium Mojo - 1

希望我能坚持看完,本文由@leonwxqian (各社交媒体同号)编写。


阅读时 Chrome版本: 75.0.3770.4


标记方法:

下划线为当前函数归属类。

A,b代表变量b,类型为A。


0.  前方逻辑

   有多个函数会调用到ProcessIncomingMessage,例如:

   MultiplexRouter::AcceptMultiplexRouter::ProcessTasksMultiplexRouter::ProcessFirstSyncMessageForEndpoint


1. MultiplexRouter::ProcessIncomingMessage

   管道控制消息(PipeControlMessage):识别此类消息时,如果消息具有无效的interface_id则认为是管道控制消息。


   判断参数类型,如果参数是管道控制消息

      -  调用MultiplexRouter::MessageWrapper::DeserializeEndpointHandlesAndTake来从Messagevalues_中解出关联的终端句柄。若失败返回空消息,否则返回value_。 

      -  返回后,若上一步成功则control_message_handler_.Accept传送消息。

      -  否则抛出异常

   若为其他类型,则

      -  解出关联的终端句柄。

      -  若终端不存在或是已关闭,则取消流程(返回true)。

      -  若终端存在但是其客户端没有连接,则取消流程(返回false)。

      -  判断是否能够进行直接调用。若不能,则试图将消息推送到终端的task runner中。

      -  反序列化消息,并将消息传递给InterfaceEndpointClient  client,endpoint->client()。即:client->HandleIncomingMessage()。

      -  失败则抛出异常。

2InterfaceEndpointClient::HandleIncomingMessage

    将消息转发给自己的FilterChain,filter_。即:filters_.Accept(message)。

    该filter_一般在InterfaceEndpointClient构造时被初始化为filters_(&thunk_)。 thunk_即:HandleIncomingMessageThunk

   

    程序也可以通过构造时或调用InterfaceEndpointClient::AddFilter来添加Filter到FilterChain中。

3 InterfaceEndpointClient::HandleIncomingMessageThunk::Accept ,调用自己的owner_的HandleValidatedMessage转发消息到父类。

4 InterfaceEndpointClient::HandleValidatedMessage

  •     消息分为两类:

    控制消息普通消息,其中控制消息定义为:

      message->header()->name ==  interface_control::kRunMessageId 或

                                                           interface_control::kRunOrClosePipeMessageId 。

     即:用于运行,或是运行或关闭某个Pipe的消息。


  •     消息分为三类处理方案,由Flag标记,消息可能包含多个Flag也可能一个都不包含,分别为:

Message::kFlagExpectsResponse0 << 0代表消息期待得到返回值
Message::kFlagIsResponse 0 << 1代表消息正是返回值
Message::kFlagIsSync0 << 2代表同步消息
  • 包含kFlagExpectsResponse的情况

    代表这是一个请求消息并期待响应。

    Make unique生成一个ResponderThunk对象。转换为MessageReceiverWithStatus。作为Responder,传递给下面的AcceptWithResponder。

    如果当前消息是:

        -  控制消息,则调用control_message_handler_.AcceptWithResponder

        -  普通消息,则调用incoming_receiver_->AcceptWithResponder

  • 包含kFlagIsResponse的情况

    代表这是一个响应消息。

    如果消息有Message::kFlagIsSync标记,则获取消息的Request ID,并查找。

        -  如果是同步消息(位于SyncResponseMapsync_responses_中),代表同步调用有返回结果,将消息放置到它的response字段中,标记消息成功返回。

        -  如果是异步消息(位于AsyncResponseMap,async_responders_中),代表某个异步调用消息返回结果,则找到该消息,取得其Responder。并将消息从async_responder_中移除,然后调用responder->Accept(message),向其返回结果。

  • 其他情况

        -  如果当前消息是控制消息,则调用control_message_handler_.Accept

        -  其他情况则调用incoming_receiver_->Accept


N. 后续逻辑

       后续则为具体的逻辑。