PVFS2源代码分析之用户系统接口src/client/sysin/sys-get-eattr.sm状态机描述

    sys-get-eattr.sm/.c文件记录了很小的一个状态机,只有三个状态。以此为例,说明状态机定义文件(.sm)、状态机源代码(.c)的格式和语义。其中,.c文件是.sm文件经common/statecomp组件编译后的产物,两者基本结构大体相同,.sm文件采用更便利开发人员的表达方式,而.c文件是符合C语言语法的表达方式,供状态机执行逻辑直接使用。

 

    .sm主要分为三部分,各部分之间使用“%%”分隔:

  1. 声明部分
         包括所有的头文件引用和需要声明的函数。
         根据文档规定,所有动作函数均需要在此述首先声明(state actions must be declared here before the state machine),但实际的.sm文件通常不作声明,因为编译器可以直接根据第2部分的状态机描述自动添加动作函数的声明。另外,第3部分中所有需要在定义前使用的函数都应在此处声明,否则编译后的.c文件不符合C语言规定。  
  2. 状态机描述部分
         依次写明各个状态(state),首状态为起始状态。每个状态包括:
    (1) 一个动作(action),进入该状态后首先执行该动作。对应动作可以是调用特定函数,也可以是跳转到其他状态机。
    (2) 若干转移(transtition),每个转移由标志值和跳转到的状态两部分组成。其中标志值由上述动作函数设定,并根据此值选择对应的转移,进入下一个状态。  
  3. 函数定义部分
         包括第2部分提到的动作函数、状态机为使用者提供的接口函数,以及其他自定义函数。动作函数的返回值决定状态机执行状况,如果是SM_ACTION_DEFERED,状态机会等待结果;如果是SM_ACTION_COMPLETE,状态机会继续运行,即开始根据标志值转入下一个状态;如果是SM_ACTION_TERMINATE,状态机则会终止。

    下面以sys-get-eattr.sm为例,说明上述各个部分:

  1. 声明部分

    这里只声明了一个函数。因为在第3部分,该函数定义位于最后,而之前的函数中存在对它的引用,所以必须在引用前声明,只能安排在此部分。   
  2. 状态机描述部分

         很显然,声明了三个状态setup_msgpair、xfer_msgpair和cleanup。以状态setup_msgpair为例,后面几行表达的语义是,进入状态后执行动作函数get_eattr_setup_msgpair;函数返回后,如果标志值为success(即整型的0),则转入状态xfer_msgpair;如果标志值为default(即整型值-1),则转入状态cleanup。
        注意状态xfer_msgpair的动作是“jump”,意思是跳转到另一个嵌套的状态机,这里是跳转到pvfs2_msgpairarray_sm。
        下图描述了该状态机:
  3. 状态机src/client/sysin/sys-get-eattr

  4. 函数定义部分

    一共定义了6个函数:
     
    PVFS_error PVFS_isys_geteattr_list
     
    PVFS_error PVFS_sys_geteattr_list
     
    PVFS_error PVFS_sys_geteattr
     
    static PINT_sm_action get_eattr_setup_msgpair
     
    static PINT_sm_action get_eattr_cleanup
     
    static int get_eattr_comp_fn
       
         其中第4个和第5个(上段代码的39行~60行)是第2部分描述的动作函数;第3个函数为接口函数,供外部程序调用该状态机,它使用了第1个和第2个函数;第6个函数在上段代码的第45行被引用,且在其定义之前,所以该函数在第1部分进行了声明。

    这个sys-get-eattr.sm文件是为方便开发人员描述状态机设计的,编译后生成符合C语言语法的sys-get-eattr.c文件,该文件与状态机控制逻辑配合执行实际操作。因此可以与sys-get-eattr.c对照阅读以加深对状态机的理解,参见sys-get-eattr.c状态机代码

世界地图矢量数据可以通过多种网站进行下载。以下是一些提供免费下载世界地图矢量数据的网站: 1. Open Street Map (https://www.openstreetmap.org/): 这个网站可以根据输入的经纬度或手动选定范围来导出目标区域的矢量图。导出的数据格式为osm格式,但只支持矩形范围的地图下载。 2. Geofabrik (http://download.geofabrik.de/): Geofabrik提供按洲际和国家快速下载全国范围的地图数据数据格式支持shape文件格式,包含多个独立图层,如道路、建筑、水域、交通、土地利用分类、自然景观等。数据每天更新一次。 3. bbbike (https://download.bbbike.org/osm/): bbbike提供全球主要的200多个城市的地图数据下载,也可以按照bbox进行下载。该网站还提供全球数据数据格式种类齐全,包括geojson、shp等。 4. GADM (https://gadm.org/index.html): GADM提供按国家或全球下载地图数据的服务。该网站提供多种格式的数据下载。 5. L7 AntV (https://l7.antv.antgroup.com/custom/tools/worldmap): L7 AntV是一个提供标准世界地图矢量数据免费下载的网站。支持多种数据格式下载,包括GeoJSON、KML、JSON、TopJSON、CSV和高清SVG格式等。可以下载中国省、市、县的矢量边界和世界各个国家的矢量边界数据。 以上这些网站都提供了世界地图矢量数据免费下载服务,你可以根据自己的需求选择合适的网站进行下载
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值