PVFS2 源代码分析之用户系统接口src/client/sysint/client-state-machine状态机生命周期和上下文

本文详细分析了PVFS2中用户系统接口的状态机从创建、启动、挂起到终止的完整生命周期。状态机的创建涉及PINT_smcb_alloc函数,启动通过PINT_client_state_machine_post函数,挂起时状态机被注册到全局变量s_completion_list,终止时调用client_state_machine_terminate进行清理。上下文在状态机中扮演重要角色,确保系统操作的归属。
摘要由CSDN通过智能技术生成

通过分析状态机的执行逻辑 ,状态机状态转移和触发嵌套/子状态机的执行过程已经基本清楚,但是一个状态机从创建、启动,到挂起、终止的完整生命周期还需进一步分析。本文涉及多个文件,但主要接口函数包含在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函数,而这里主要讨论调用该函数

    • 0
      点赞
    • 1
      收藏
      觉得还不错? 一键收藏
    • 3
      评论
    评论 3
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值