.sm文件的装态机描述部分:
machine pvfs2_client_get_eattr_sm
{
state setup_msgpair
{
run get_eattr_setup_msgpair;
success => xfer_msgpair;
default => cleanup;
}
state xfer_msgpair
{
jump pvfs2_msgpairarray_sm;
default => cleanup;
}
state cleanup
{
run get_eattr_cleanup;
default => terminate;
}
}
其中有三个状态set_msgpair xfer_msgpair cleanup
对应生成的.c文件的部分为:
struct PINT_state_machine_s pvfs2_client_get_eattr_sm = {
.name = "pvfs2_client_get_eattr_sm", //对应状态机的名字
.first_state = &ST_setup_msgpair //对应状态机的第一个状态
};
static struct PINT_state_s ST_setup_msgpair = { //第一个状态
.state_name = "setup_msgpair" , //状态名称
.parent_machine = &pvfs2_client_get_eattr_sm , //父状态机
.flag = SM_RUN , //标志对应.sm文件中第一个状态的run动作
.action.func = get_eattr_setup_msgpair , //状态动作函数
.pjtbl = NULL ,
.trtbl = ST_setup_msgpair_trtbl //状态转移表
};
static struct PINT_tran_tbl_s ST_setup_msgpair_trtbl[] = { //状态转移表
{ .return_value = 0 , //success(0),进入下一个状态xfer_msgpair
.next_state = &ST_xfer_msgpair },
{ .return_value = -1 , //default(-1),进入cleanup
.next_state = &ST_cleanup }
};
static struct PINT_state_s ST_xfer_msgpair = { //与第一个状态类似
.state_name = "xfer_msgpair" ,
.parent_machine = &pvfs2_client_get_eattr_sm ,
.flag = SM_JUMP , //标志对应状态的动作为jump
.action.nested = &pvfs2_msgpairarray_sm , //.nested表明跳到一个其他的状态机文件
.pjtbl = NULL ,
.trtbl = ST_xfer_msgpair_trtbl
};
static struct PINT_tran_tbl_s ST_xfer_msgpair_trtbl[] = {
{ .return_value = -1 ,
.next_state = &ST_cleanup }
};
static struct PINT_state_s ST_cleanup = {
.state_name = "cleanup" ,
.parent_machine = &pvfs2_client_get_eattr_sm ,
.flag = SM_RUN ,
.action.func = get_eattr_cleanup ,
.pjtbl = NULL ,
.trtbl = ST_cleanup_trtbl
};
static struct PINT_tran_tbl_s ST_cleanup_trtbl[] = { //终止
{ .return_value = -1 ,
.flag = SM_TERM }
};