现在开始讲解在双向传输,使用transaction_stack机制的作用。 假设有三个进程p1,p2,p3分别提供S1,S2,S3服务,他们分别有自己的线程t,如下图: 假设t1线程需要使用p2服务,他会向t2线程发送数据,在t2线程发送数据发送数据的时候,又要使用到p3服务,会向t3线程发送数据,在t3线程处理的过程中,他又要回过头使用p1服务。
那么问题就来了,此时的t3线程应该发送数据给谁?或者说着t3把数据放到p1的binder_proc.todo链表,让p1使用新的线程t1’进行处理,还是把数据放到t1的binder_thread.todo,让t1线程处理。
大家想想那种更加节约资源?反正t1线程也处于休眠状态,我们可以让他做些事情。如果开一个新的t1‘进行处理,后面遇到类似的情况都会开一个新的线程,如果这种情况的次数发生多了,就会产生很多的线程,特别的浪费资源。
所以双向传输过程如下: p1的t1发出服务请求,处理的过程中,需要用到s1服务,他会发送数据给p1。反正p1发送数据之后,处于等待状态,所以使用t1来处理S1服务。这
在情景分析之前,我们回顾一下之前的知识,如下:
1.A向B发送数据BC_TRANSACTION
TR通过from_parent入栈
2.B接收到BR_TRANSACTION
TR通过to_parent入栈(与上面的使用同一个栈)
3.B进程处理完数据之后,会回复一个BC_REPLY
TR通过from_parent出栈,
TR通过to_parent出栈
4.A进程收到BR_REPLY(其不涉及到栈的操作)
下面我们进行情景分析 t1通过TR1发送给t2,t2通过TR2发送给t3,t3会通过TR3发送给谁呢?
1.首先由t1发送一个BC_TRANSACTION,t1的栈sp指向TR1.fromparent=NULL 2.t2收到一个BR_TRANSACTION,t2的栈sp指向TR2.to_parent=NULL。 3.t2紧接着发送一个BC_TRANSACTION,t2的栈sp指向TR2.fromparent就指向TR1.fromparent=NULL 4.t3收到一个BR_TRANSACTION,t3的栈sp指向TR2.to_parent=NULL,其要用到S1服务,会构造一个BC_TRANSACTION,发送给t1。