16.3.3 语义

Call Actions

Call Action是一个调用Behavior或Operation的InvocationAction,它有三类:

  1. CallBehaviorAction直接调用某个Behavior,而非调用一个BehaviorFeature再导致一个Behavior被调用。
  2. CallOperationAction向目标对象发送一个Operation访问请求消息,从而可能使得一个相关联的Behavior被调用。目标对象取自CallOperationAction的target InputPin。目标对象对于Operation访问请求的处理请参见13.2.3的Behavioral Features和Methods,以及13.3.3的Message Event。
  3. StartObjectBehaviorAction启动某个直接实例化的Behavior开始执行,或是某个对象的classifierBehavior开始执行。要启动的对象取自object InputPin。如果输入对象是一个之前没有在运行的实例化的Behavior,那么它开始运行。如果输入对象具有一个之前没有在运行的classifierBehavior,那么它被实例化并开始运行。任何情况下,如果所指的Behavior已经在运行,那么StartObjectBehavior则无任何效果。
    • 注意.如果输入对象不是一个实例化的Behavior,那么它必须有一个classifierBehavior。如果输入对象是一个实例化的Behavior,它也可能有一个classifierBehavior,那么它也会被启动。如果这个classifierBehavior自身也有一个classifierBehavior,那么它也会递归地被启动,以此类推。

CallAction可能直接或者通过某个Operation间接的导致一个同步或异步Behavior的调用。

  • 如果访问是同步的(isSynchronous=true),那么该Action的执行必须等到所调用的Behavior执行结束。(如果这个Behavior没有正常执行结束,而是抛出了一个异常,那么该异常会传播到该CallAction,参见15.5.316.13关于异常如何处理。)
  • 如果访问时异步的(isSynchronous=false),那么只要Behavior一被调用,那么该Action就执行完毕。异步访问结束后,包含该CallAction的Behavior会与被调用的Behavior独立或是并发的执行。

如果CallAction所调用的Behavior是不可重入的,那么任意时刻,最多只有一个Behavior在执行(参见13.2.2)。如果Behavior是不可重入的,那么当它已经在执行的时候,另一个对它的调用可能不会启动一个新的执行,在当前的执行结束后,可能会启动一个新的执行。对可重入的Behavior的调用可能会启动一个新的执行,即使当有Behavior已经在运行。然而,如果CallAction的isLocallyReentrant=false,那么如果在所属的Behavior中该Action已经有一个调用的Behavior还在运行中,那么该Action不会对所要访问Behavior启动一个新的执行,直到当前的执行结束(参见16.2.3)。

Behaviors和Operations对自身参数是有顺序要求的,这些有序的参数要与CallAction的Pins进行匹配。CallAction的argument Pins要依序与输入参数进行匹配;result Pins依序与输出参数进行匹配,类型、次序,以及参数和结果pins的multiplicity都要与相应的Parameters相同。

当CallAction执行时,它通过argument Pins把值传给要调用的Behavior或Action,作为后者的入参。如果调用时同步的,那么由输出参数返回的值以tokens的形式放置于CallAction的result Pins。如果输出参数没有值,那么将会在相应的result Pin放一个空totken。如果访问是异步的,结果值不会返回。

只要有流属性的Parameters(isStreaming=true),调用就是同步的(参见关于流Behavior参数的讨论13.2.3)。此种情形下,当被调用的Behavior正在运行,那么CallAction就会在与流输入参数相对应的argument Pins上不断的接收收到的tokens,直到达到每个Pin的multiplicity上限,它们被Action所消费并发送给正在执行的Behavior。流输出参数的值提交置相应的result Pins(每个Pin能接收的数目是multiplicity上限)。实际上,流参数使得Behavior在运行过程中能够不断收发来自CallAction的token流。

除了16.2.3给出的Actions执行规则外,如下规则也适用于调用具有流参数Behavior或Operation的CallAction:

  • 如果CallAction的所有用于流参数argument Pins的multiplicity的下限都大于0,那么在CallAction执行前至少一个要有一个值。
  • 在CallAction可以正常结束之前,与流参数相对应的每个argument Pin上大于或等于其multiplicity下限的值都要被接收。
  • 在被调用的Behavior正常执行结束(没有抛出异常,没有异常参数值,参见16.13)之前,CallAction的每个result Pin上都要接收至少是其multiplicity下限个数目的值。如果被调用的Behavior没有正常结束,那么result Pins接收到的值个数可能比其multiplicity的下限小。

当CallAction调用具有以ParemeterSets进行分组的参数的Behavior或Operation时,还要满足如下特殊规则。

  • 如果Behavior或Operation具有输入ParameterSets,[TODO 补充。。。。]
  • 如果Behavior或Operation具有输出ParameterSets,并且CallAction正常结束,那么该CallAction应该只在那些与一个输出ParameterSet相对应的Outputs上产生输出,而且对象tokenks也由这些OutputPins交付给流出的ActivityEdges。没有对象tokens经由其它OutputPins提供给下游,即使是空tokens也不行。

results matching ""

    No results matching ""