zoukankan      html  css  js  c++  java
  • Rocket

    https://mp.weixin.qq.com/s/v8plWCBD8vZkxykjJe4TCg
     
    介绍AsyncCrossing的实现,主要介绍如何实现diplomacy Node和LazyModule相关内容。
     
     
    1. TLAsyncCrossingSource
     
    异步上游节点(源节点):
     
    1) node:LazyModule的节点成员
     
    node用于与其他diplomacy节点协商参数,在这里是一个异步上游节点:
     
    TLAsyncSourceNode是一个适配器节点:
     
    其使用实例如下:
     
    每一条边在tilelink中是一个link,每条link必然包含a/d两个channel(TL-UL/TL-UH),可能包含b/c/e三条channel(TL-C)。
     
    2) LazyModuleImp匿名子类的实例
     
    TLAsyncCrossingSource是一个原子节点,其内部没有其他子节点。所以其实现只需要连接好输入边和输出边,实现处理逻辑即可。TLAsyncCrossingSource的处理逻辑是添加异步处理。
     
    a. LazyModuleImp的匿名子类
     
    花括号中定义的是LazyModuleImp的匿名子类。因为这个类只在这里使用一次,所以没有命名。
     
    b. 实例化
     
    这里的使用就是直接将其实例化:new LazyModuleImp(this) { ... }
     
    3) 节点逻辑的实现
     
    a. 取出一对输入输出边
     
    适配节点把输入边适配之后,通过输出边输出,所以这里输入边和输出边成对取出:
     
    b. 判断是否TL-C,即是否支持channel b/c/e:
     
    Acquire/Probe都是处理Permission的Transfer消息,TL-C独有:
     
    c. 对必然支持的channel a/d做异步处理
     
    - 输入边的channel a(in.a)经过异步处理,输出到输出边的channel a(out.a);
    - 输出边的channel d(out.d),经过异步处理,输出到输入边的channel d(in.d);
     
    d. 若支持b/c/e,则对其做异步处理
     
    根据channel方向的不同,使用ToAsyncBundle/FromAsyncBundle:
     
    e. 若不支持b/c/e,则处理成:不打扰对方。
     
     
     
    2. TLAsyncCrossingSink
     
     
    1) node:LazyModule的节点成员
     
    node用于与其他diplomacy节点协商参数,在这里是一个异步上游节点:
    TLAsyncSinkNode也是一个适配器节点。
     
    2) LazyModuleImp匿名子类的实例
     
    a. LazyModuleImp的匿名子类
     
    花括号中定义的是LazyModuleImp的匿名子类。因为这个类只在这里使用一次,所以没有命名。
     
    b. 实例化
     
    这里的使用就是直接将其实例化:new LazyModuleImp(this) { ... }
     
    3) 节点逻辑的实现
     
    a. 取出一对输入输出边
     
    适配节点把输入边适配之后,通过输出边输出,所以这里输入边和输出边成对取出:
     
    b. 判断是否TL-C,即是否支持channel b/c/e:
     
    Acquire/Probe都是处理Permission的Transfer消息,TL-C独有:
     
    c. 对必然支持的channel a/d做异步处理
     
    - 输入边的channel a(in.a)经过异步处理,输出到输出边的channel a(out.a);
    - 输出边的channel d(out.d),经过异步处理,输出到输入边的channel d(in.d);
     
    d. 若支持b/c/e,则对其做异步处理
     
    根据channel方向的不同,使用ToAsyncBundle/FromAsyncBundle:
     
    e. 若不支持b/c/e,则处理成:不打扰对方。
     
     
    3. 对比
     
    1) TLAsyncCrossingSource的diplomacy节点定义为:
     
     
    MixedAdapterNode传入了两个参数:TLImp, TLAsyncImp,分别作为InwardNodeImp, OutwardNodeImp:
     
    也就是说输入边使用的是TLImp这一组类:
     
    输出边使用的是TLAsyncImp这一组类:
     
    TLImp这一组是标准接口:
     
    TLAsyncImp这一组是添加了异步处理的接口:
     
    所以对TLAsyncCrossingSource而言,输入边是标准的tilelink连接(link, 包含channel a/b/c/d/e), 而输出边是加了异步处理的tilelink连接。
     
    异步信号从TLAsyncCrossingSource节点发出,所以是异步信号的上游节点(Source)。
     
    2) TLAsyncCrossingSink的diplomacy节点定义为:
     
    与TLAsyncCrossingSource相反:
    其输入边为加了异步处理的TLAsyncBundle,输出边为TLBundle。
     
    异步信号输入TLAsyncCrossingSink节点,所以是下游节点(Sink)。
     
    3) 组合
     
    TLAsyncCrossingSource和TLAsyncCrossingSink连接在一起,组成了一个异步适配结构。输入的TLBundle输入TLAsyncCrossingSource节点,经过这个适配结构异步处理之后,从TLAsyncCrossingSink的输出边输出。
     
    4. TLAsyncCrossing
     
    TLAsyncCrossingSource和TLAsyncCrossingSink连接在一起:
     
    1) 复合节点:包含子节点
     
    这是一个复合节点,其内部包含source/sink两个子节点。
     
    2) 子节点连接
     
    这两个节点直接连在一起:sink.node := source.node
     
    3) 悬边(Dangle)
     
    悬边是指子节点悬而未连的边。
     
    source没有输入边,sink没有输出边。所以自成一体,不需要跟父节点连接。也就不存在需要父节点中转(forward)的悬边(Dangle)。
     
    4) 适配器节点
     
    source是一个适配器节点,但是并没有输入边连接,所以不能适配输入只能自行输出;
    sink是一个适配器节点,但是并没有输出边连接,所以不能把输入适配出去,只能自行消化;
     
    由此可以看出,适配器节点的特点是,有则适配,无则不适配。
     
    5) 时钟和复位信号
     
    source和sink这两个LazyModule包含时钟和复位信号,TLAsyncCrossing需要为他们引入时钟和复位信号。
     
     
    5. 组合与继承
     
    可以看到diplomacy Node是以组合的形式出现在各个LazyModule中的,如TLAsyncCrossingSource和TLAsyncCrossingSink中都有一个node成员。
     
    这个意义是:
    a. TLAsyncCrossingSource有一个(has a)异步处理上游节点(TLAsyncSourceNode);
    b. TLAsyncCrossingSink有一个(has a)异步处理下游节点(TLAsyncSinkNode);
     
    如果使用继承关系,意义就是:
    a. TLAsyncCrossingSource是一个(is a)异步处理上游节点(TLAsyncSourceNode);
    b. TLAsyncCrossingSink是一个(is a)异步处理下游节点(TLAsyncSinkNode);
     
    两者在意义上不相同,在使用上灵活度也不同。这里权且提出这个问题,不做深入讨论。
     
  • 相关阅读:
    kotlin类与对象——>对象表达式与对象声明、内联类
    kotlin类与对象——>嵌套类与内部类、枚举类
    kotlin类与对象——>数据类、密封类、泛型
    UIView的setNeedsLayout, layoutIfNeeded 和 layoutSubviews 方法之间的关系解释
    xcode 统计代码行数
    iOS 常用的一些公用方法
    如何在一个项目中去建立多个Target
    instrument linker 的使用
    25 优化技巧
    二维码生成与扫描
  • 原文地址:https://www.cnblogs.com/wjcdx/p/11169000.html
Copyright © 2011-2022 走看看