通过分析状态机的执行逻辑 ,状态机状态转移和触发嵌套/子状态机的执行过程已经基本清楚,但是一个状态机从创建、启动,到挂起、终止的完整生命周期还需进一步分析。本文涉及多个文件,但主要接口函数包含在src/client/sysint目录下的client-state-machine.h和client-state-machine.c文件中,这些接口函数会调用src/common/id-generator和src/io/job目录下的相关函数。
说明:如下函数名后的括号注明其所在文件,贴出代码为除去gossip日志和次要无关逻辑之后的核心代码,“// ......”表示此处有省略。另外,背景色 相同的行为是配对的,显式标出以方便理解前后对应的流程。
- 创建
我们知道,状态机的标识是状态机控制块smcb,分配smcb意味着状态机的创建,见函数1。
函数1. PINT_smcb_alloc(src/common/misc/state-machine-fns.c)
该函数用于分配状态机控制块。第3行参数op是状态机代表的系统操作;第5行参数方程用于将op映射为对应状态机的地址,并依据找到的状态机定义设定smcb->current_state,为执行动作函数和状态转移做好准备;第6行参数是回调函数,在状态机终止时调用;第7行参数是该应用程序的上下文(context),以区别于同时进行的其他应用程序(应用程序指src/apps下的各个程序),详见最后一节“上下文”。
为了更好地说明参数含义,我们以分析过的用户系统接口sys-get-eattr 为例,见函数2。
函数2. PVFS_isys_geteattr_list(src/client/sysint/sys-get-eattr.c)
该函数最终被状态机对外接口函数PVFS_sys_geteattr调用。它调用PINT_smcb_alloc时,状态机结束的回调函数设为client_state_machine_terminate,参见函数10 。
第10行参数op赋值为PVFS_SYS_GETEATTR,其定义来自src/client/sysint/client-state-machine.h:
op参数赋值给smcb的成员op,用于表达状态机进行的操作,实际上记录了使用哪个状态机。
【注意】另一个参数op_id与之形似但无关,它是在状态机挂起时,在哈希表中注册对应smcb时获得的索引,可视作状态机的一个句柄。
- 启动
在状态机的执行逻辑 中,我们分析了PINT_state_machine_start函数,而这里主要讨论调用该函数的环节和相关操作。
由上节函数2的第20~21行可知,启动状态机是通过调用PINT_client_