希望我能坚持看完,本文由@leonwxqian (各社交媒体同号)编写。
阅读时 Chrome版本: 75.0.3770.4
标记方法:
下划线为当前函数归属类。
A,b代表变量b,类型为A。
0. 前方逻辑
有多个函数会调用到ProcessIncomingMessage,例如:
MultiplexRouter::Accept、MultiplexRouter::ProcessTasks、MultiplexRouter::ProcessFirstSyncMessageForEndpoint。
1. MultiplexRouter::ProcessIncomingMessage
管道控制消息(PipeControlMessage):识别此类消息时,如果消息具有无效的interface_id则认为是管道控制消息。
判断参数类型,如果参数是管道控制消息:
- 调用MultiplexRouter::MessageWrapper::DeserializeEndpointHandlesAndTake来从Message,values_中解出关联的终端句柄。若失败返回空消息,否则返回value_。
- 返回后,若上一步成功则control_message_handler_.Accept传送消息。
- 否则抛出异常
若为其他类型,则
- 解出关联的终端句柄。
- 若终端不存在或是已关闭,则取消流程(返回true)。
- 若终端存在但是其客户端没有连接,则取消流程(返回false)。
- 判断是否能够进行直接调用。若不能,则试图将消息推送到终端的task runner中。
- 反序列化消息,并将消息传递给InterfaceEndpointClient client,endpoint->client()。即:client->HandleIncomingMessage()。
- 失败则抛出异常。
2. InterfaceEndpointClient::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::kFlagExpectsResponse | 0 << 0 | 代表消息期待得到返回值 |
Message::kFlagIsResponse | 0 << 1 | 代表消息正是返回值 |
Message::kFlagIsSync | 0 << 2 | 代表同步消息 |
包含kFlagExpectsResponse的情况
代表这是一个请求消息并期待响应。
Make unique生成一个ResponderThunk对象。转换为MessageReceiverWithStatus。作为Responder,传递给下面的AcceptWithResponder。
如果当前消息是:
- 控制消息,则调用control_message_handler_.AcceptWithResponder。
- 普通消息,则调用incoming_receiver_->AcceptWithResponder。
包含kFlagIsResponse的情况
代表这是一个响应消息。
如果消息有Message::kFlagIsSync标记,则获取消息的Request ID,并查找。
- 如果是同步消息(位于SyncResponseMap,sync_responses_中),代表同步调用有返回结果,将消息放置到它的response字段中,标记消息成功返回。
- 如果是异步消息(位于AsyncResponseMap,async_responders_中),代表某个异步调用消息返回结果,则找到该消息,取得其Responder。并将消息从async_responder_中移除,然后调用responder->Accept(message),向其返回结果。
其他情况
- 如果当前消息是控制消息,则调用control_message_handler_.Accept。
- 其他情况则调用incoming_receiver_->Accept。
N. 后续逻辑
后续则为具体的逻辑。