PVFS2为每个用户系统接口(src/client/sysint)定义了状态机,而状态机的执行逻辑存在于src/common/misc文件夹下的state-machine.h和state-machine-fns.c两个文件。state-machine.h定义了状态机执行逻辑所需的数据结构,state-machine-fns.c文件定义了功能函数。
- 数据结构
state-machine.h的数据结构各个条目有何含义我们暂不细究,但需首先明确这些数据与函数的作用关系。例如,标志状态机实例的状态机控制块
注意其中的控制变量(control variables ),即第19~22行,表明了当前操作的状态,由某些函数设定后,后续函数读取并根据这些“标志位”采取不同的行为。这是将函数关联起来并控制流程的重要手段。
除此之外,该状态机控制块中还存储状态机所需数据,如状态栈(第5~6行)、帧栈(第8~10行);以及指向相关数据的引用,如父状态机控制块指针(第18行)、任务上下文ID(第24行)等。
其中帧(frame)是个很重要的角色:
帧保存状态机所需的额外数据,通常与状态机实例一一对应,它的行为伴随着状态机的产生和撤销。当一个状态机启动嵌套状态机时,它会在帧栈中压入新帧。帧栈使用quicklist 实现。
state-machine.h中的其他数据结构很多在状态机定义中(参见sys-get-eattr.c )已经提及,这里就是它们的原型。
- 功能函数
下面重点分析state-machine-fns.c文件,即状态机控制逻辑的操作。阅读函数的顺序和原文件中不一定相同。另外,有关gossip_debug函数及其前后数据准备的部分可以略去,只是日志功能;下面代码都是略过这些之后的核心逻辑。
- 帧栈相关操作
数据结构已在上一部分介绍,有关帧的操作在状态机执行中很普遍,首先集中介绍一下。