Chromium进程间的通信机制浅析(android版本)(二)

一、 初始化流程

每一个RenderProcessHostImpl(RenderProcessImpl)都会ChannelProxy(SyncChannel)—>ChannelProxy::Context—>Channel—>ChannelImpl—>ChannelReader依次初始化下去。并且将this指针传递给下一个类,这样发送消息时层层向下传递。接收消息时则逆向传递。

网络连接建立过程:

Chromium进程间的通信机制浅析(android版本)(二)

主要对象初始化流程:

Chromium进程间的通信机制浅析(android版本)(二)

过滤器初始化流程:

Chromium进程间的通信机制浅析(android版本)(二)

二、 通信机制

1. 异步消息通信机制

异步消息机制相对来说比较简单,实际产生消息的线程将消息抛给IO线程任务队列后立即返回。IO线程发送消息。对端IO线程接收消息后放入本线程任务队列。最终在本线程执行,或者抛入其他线程的任务队列。

2. 同步消息通信机制

同步消息机制比较复杂,产生消息的线程A将消息抛给IO线程的任务队列后,会阻塞在一个条件变量上,等待IO线程返回同步消息应答将其唤醒。

SyncContext维护了一个线程安全的队列,用于监听来自I/O线程的同步消息应答。当应答来到,并且匹配到某一消息ID,其就会唤醒阻塞的原线程。

在原线程阻塞期间,同样有可能有消息到来,异步消息被放入任务队列并等待解除阻塞之后进行处理。而同步消息必须以可重入的方式进行处理,以避免死锁。

ReceivedSyncMsgQueue类专门用来处理此时收到的同步消息。此类是处理同步消息的关键。当阻塞在Send()时,我们必须立即处理同步消息,以防止其阻塞应答。。。。。。好复杂。。。。晕了。。。。

总的来说,同步消息会使线程阻塞等待应答。此时若收到应答则解除阻塞,若收到异步消息则放入任务队列,收到同步消息则进行某种处理。。。。。。此时为了避免使用复杂的互斥锁和条件变量,就有一个WaitableEvent类作为线程同步工具,来等待处理某事件。。。。