Rocket

https://mp.weixin.qq.com/s/6XX0CZHoDotIgLbNDSIUog

 
简单介绍Filter的实现。
 
 
1. 基本介绍
 
使用过滤器过滤掉client和manager的一部分能力。
 
2. ManagerFilter/ClientFilter
 
用于对manager和client进行过滤:
a. 若过滤掉则返回None;
b. 若没过滤掉,也可能进行更改;
 
3. mIdentity/cIdentity
 
不产生任何变化的过滤器:
 
4. diplomacy node
 
1) TLAdapterNode
 
是一个适配器节点。
 
2) clientFn
 
把本节点看到的client参数,映射为下游节点看到的client参数:
a. 把client都经过过滤器处理一遍;
b. 确保过滤器过滤掉一部分能力:
这里IDEA提示把out.map换为out.foreach比较好。
 
看最后一个:require(!c.requestFifo || o.requestFifo)
从中可以看出:不需要fifo比需要fifo能力强。不需要fifo说明client具备请求序列化的能力,需要fifo则client自身不具备,需要manager使用fifo来为之实现。
a. 若c.requestFifo=false,表明c不需要fifo,那么无论o需不需要fifo都不超过c的能力;
b. 若c.requestFifo=true, 则o.requestFifo=true,即如果c不具备序列化的能力,那么o也不能具备;
 
3) managerFn
 
把本节点看到的manager参数,映射为上游节点看到的manager参数:
a. 把manager都经过过滤器处理一遍;
b. 确保过滤器过滤掉一部分能力:
 
也看最后一个:require(o.fifoId.isEmpty || m.fifoId == o.fifoId)
从中可以看出:具有fifoId的能力要强于没有fifoId。原因在于,有fifoId则内部实现了针对该fifoId的序列化功能。
 
5. lazy module
 
用于实现内部逻辑。
 
 
1) 成对出现的输入边和输出边
 
 
2) 输入边和输出边直连即可
 
由此可以看出Filter的功能,主要通过diplomacy node实现。
 
3) 若不支持Acquire操作,则默认关闭channel b/c/e:
 
 
6. object TLFilter
 
其中定义了一些过滤器实例。
 
1) mIdentity/cIdentity
 
不做改变:
 
2) mSelectIntersect
 
这是一个manager过滤器:
把manager中的地址集合与参数select求交集,并调整transfer的能力。
 
3) mHideContained
 
 
重构一下:
只保留没有被container完全包含的地址集合。
 
4) mHideCacheable
 
去除支持Cache的manager:
 
5) mSelectCacheable
 
去除不支持Cache的manager:
 
6) mMaskCacheable
 
去除支持cache的manager的cache能力:
 
7) mSelectAndMaskCacheable
 
a. 去除支持cache的manager的cache能力;
b. 去除不支持cache的manager;
 
8) cHideCaching
 
去除支持cache的client:
 
9) cSelectCaching
 
选择支持cache的client:
 
 
 
 
原文地址:https://www.cnblogs.com/wjcdx/p/11348161.html