当前位置:   article > 正文

鸿蒙源码分析(六十八)--service代码_在鸿蒙开发service

在鸿蒙开发service

service代码分析

主要分析service部分代码和service_impl.h相关结构体
文件位置distributedschedule_samgr_lite\samgr\source\service.c

头文件注释传送门

service.h注释

service_impl.h相关结构体的支撑

服务实例

//服务的实例对象
typedef struct ServiceImpl ServiceImpl;
struct ServiceImpl {
    Service *service;//指定服务
    IUnknown *defaultApi;//默认接口
    TaskPool *taskPool;//任务池
    Vector features;//vector
    int16 serviceId;//服务ID
    uint8 inited;   //服务状态
    Operations ops;
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

初始化的状态码

enum InitStatus {
    SVC_INIT = 0,   //初始化
    SVC_IDLE,       //空闲
    SVC_BUSY,       //繁忙
};
  • 1
  • 2
  • 3
  • 4
  • 5

Operations用来记录服务的相关信息
这个结构体像是一个监视日志。把服务的一些信息全部记录

typedef struct Operations Operations;
struct Operations {
    uint8 abnormal;  //异常情况次数
    uint8 step;      //记录samgr的阶段
    uint16 messages; //记录service所处理的消息数量,也是一个任务数量
    uint32 timestamp;//处理的最新的一条消息的时间,通过函数getprocesstime实现
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

源代码

添加feature子功能
主要就是添加feature,如果添加成功就返回添加对象feature的id。
函数实现过程中会判断是否有位置可以添加feature,如果下属的feature位置满了就不能添加。如果未到上线,就封装为实例添加进服务
参数介绍:

  • serviceImpl:服务对象,一个服务实例。要添加进的母体对象
  • feature:需要添加的feature
int16 DEFAULT_AddFeature(ServiceImpl *serviceImpl, Feature *feature)
{
    //参数检查
    if (serviceImpl == NULL || feature == NULL) {
        return INVALID_INDEX;
    }
    //判断vector对象features中data实际占用空间,即元素个数 是否超限
    if (VECTOR_Num(&(serviceImpl->features)) >= MAX_FEATURE_NUM) {
        return INVALID_INDEX;
    }
    //根据feature创建一个FeatureImpl对象
    FeatureImpl *impl = FEATURE_CreateInstance(feature);
    if (impl == NULL) {
        return INVALID_INDEX;
    }
    //将impl添加到vector对象的features中
    int16 featureId = VECTOR_Add(&(serviceImpl->features), impl);
    if (featureId == INVALID_INDEX) {
        //若添加失败则释放impl的空间
        SAMGR_Free(impl);
    }
    return featureId;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

服务实例的初始化
这个函数就是为了初始化ServiceImpl

void DEFAULT_Initialize(ServiceImpl *impl)
{
    //参数检查
    if (impl == NULL) {
        return;
    }
    //配置身份标识,包含serviceId,featureId和queueId,消息队列id通过服务绑定的任务池来获取
    Identity id = {impl->serviceId, INVALID_INDEX, (impl->taskPool != NULL) ? impl->taskPool->queueId : NULL};
    //service初始化
    //在Samgr给一个服务分配任务后,该服务在自己的任务中调用Initialize函数
    impl->service->Initialize(impl->service, id);
    //获取service的name,返回一个常量字符串
    const char *serviceName = impl->service->GetName(impl->service);
    //注册API
    SAMGR_RegisterServiceApi(serviceName, NULL, &id, impl->defaultApi);
    //获取features中data的大小
    int16 size = VECTOR_Size(&impl->features);
    int16 i;
    //遍历ServiceImpl的features中所有的FeatureImpl
    for (i = 0; i < size; ++i) {
        //获取指定下标的FeatureImpl对象
        FeatureImpl *feature = (FeatureImpl *)VECTOR_At(&(impl->features), i);
        if (feature == NULL) {
            continue;
        }
        //标识当前服务下指定的feature
        id.featureId = i;
        /*
            初始化feature,Samgr将任务分派给服务后,该服务在其自己的任务中调用OnInitialize
            @param1:指向当前feature
            @param2:指向feature所属的服务
            @param3:身份标识
        */
        feature->feature->OnInitialize(feature->feature, impl->service, id);
        //注册API
        SAMGR_RegisterServiceApi(serviceName, feature->feature->GetName(feature->feature), &id, feature->iUnknown);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

剩下部分函数我们下一篇分析。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/313480
推荐阅读
相关标签
  

闽ICP备14008679号