鸿蒙源码分析(六十八)--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;
};

初始化的状态码

enum InitStatus {
    
    
    SVC_INIT = 0,   //初始化
    SVC_IDLE,       //空闲
    SVC_BUSY,       //繁忙
};

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

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

源代码

添加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;
}

服务实例的初始化
这个函数就是为了初始化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);
    }
}

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

猜你喜欢

转载自blog.csdn.net/m0_46976252/article/details/121048831