OpenHarmony轻量系统服务管理|samgr_lite功能详解(三)

本文继续分析samgr_lite的函数实现。文件位于distributedschedule_samgr_lite\samgr\source\samgr_lite.c

函数实现分析

为服务注册子功能

/*
    函数功能:注册功能
    函数描述:向服务中注册指定的功能,该服务需要是SVC_INIT状态。
             将feature封装为FeatureImpl对象,再添加到ServiceImpl的features中
*/
static BOOL RegisterFeature(const char *serviceName, Feature *feature)
{
    if (IsInvalidFeature(feature)) {
        return FALSE;
    }
    //根据name获取对应的serviceImpl对象
    ServiceImpl *serviceImpl = GetService(serviceName);
    if (serviceImpl == NULL || serviceImpl->inited != SVC_INIT) {
        //需要在服务初始化前注册feature
        return FALSE;
    }
    //根据serviceImpl和featureName获取FeatureImpl对象
    if (DEFAULT_GetFeature(serviceImpl, feature->GetName(feature)) != NULL) {
        //服务中已存在当前的FeatureImpl
        return FALSE;
    }
    //将feature封装为FeatureImpl对象,再添加到ServiceImpl的features中
    int16 featureId = DEFAULT_AddFeature(serviceImpl, feature);
    if (featureId < 0) {
        return FALSE;
    }
    return TRUE;
}

删除服务中的子功能

/*
    函数功能:删除功能
    函数描述:删除服务中的指定功能,该功能的iunknown不能为NULL,否则返回NULL。
             先停止功能然后删除,并返回被删除的feature。
*/
static Feature *UnregisterFeature(const char *serviceName, const char *featureName)
{
    //通过serviceName获取serviceImpl对象
    ServiceImpl *serviceImpl = GetService(serviceName);
    if (serviceImpl == NULL) {
        return NULL;
    }
    //删除serviceImpl中名称为featureName的feature,删除的同时停止feature
    return DEFAULT_DeleteFeature(serviceImpl, featureName);
}

注册API接口

/*
    函数功能:注册API接口
    函数描述:向指定服务的指定功能注册API接口。
             若该功能不存在,则注册到服务的默认API中。
             若该功能存在且未注册API,则进行注册,否则失败。
*/
static BOOL RegisterFeatureApi(const char *serviceName, const char *feature, IUnknown *publicApi)
{
    //判断指定的IUnknown是否有效
    if (IsInvalidIUnknown(publicApi)) {
        return FALSE;
    }
    //在samgr中查找指定name的serviceImpl对象
    ServiceImpl *serviceImpl = GetService(serviceName);
    if (serviceImpl == NULL) {
        return FALSE;
    }
    //若feature为NULL,则将publicApi添加到serviceImpl->defaultApi
    if (feature == NULL) {
        if (serviceImpl->defaultApi != NULL) {
            //已注册有默认接口,返回false
            return FALSE;
        }
        serviceImpl->defaultApi = publicApi;
        return TRUE;
    }
    //服务中存在子功能
    //根据serviceImpl和feature获取FeatureImpl对象
    FeatureImpl *featureImpl = DEFAULT_GetFeature(serviceImpl, feature);
    if (featureImpl == NULL) {
        return FALSE;
    }
    //为featureImpl添加接口,FeatureImpl包含两个成员:feature和iUnknown
    return SAMGR_AddInterface(featureImpl, publicApi);
}

删除API接口

/*
    函数功能:删除API接口
    函数返回:成功 返回被删除的iunknown,失败 返回NULL
    函数描述:删除指定服务下指定功能的API接口
             若参数feature为NULL,则删除serviceImpl中的defaultApi。
             若不为NULL,则删除指定的featureImpl的iunknown
*/
static IUnknown *UnregisterFeatureApi(const char *serviceName, const char *feature)
{
    //在samgr中查找指定name的serviceImpl对象
    ServiceImpl *serviceImpl = GetService(serviceName);
    if (serviceImpl == NULL) {
        return NULL;
    }
    //若feature为NULL,则将serviceImpl->defaultApi置为NULL
    if (feature == NULL) {
        IUnknown *iUnknown = serviceImpl->defaultApi;
        serviceImpl->defaultApi = NULL;
        return iUnknown;
    }
    //若feature不为NULL,则将featureImpl的iUnknown成员赋值为NULL,并返回iUnknown
    return SAMGR_DelInterface(DEFAULT_GetFeature(serviceImpl, feature));
}

注册默认API接口

/*
    函数功能:注册默认API接口
    函数返回:注册成功返回true,注册失败返回false
    函数描述:向服务注册默认的API接口。
             即将iunknown赋值给serviceImpl->defaultApi
*/
static BOOL RegisterDefaultFeatureApi(const char *serviceName, IUnknown *publicApi)
{
    //feature为NULL,将接口赋给serviceImpl->defaultApi
    return RegisterFeatureApi(serviceName, NULL, publicApi);
}

删除默认API接口

/*
    函数功能:删除默认API接口
    函数返回:删除成功返回被删除的iunknown,删除失败返回NULL
    函数描述:删除服务的默认API接口。
             即将serviceImpl->defaultApi置为NULL
*/
static IUnknown *UnregisterDefaultFeatureApi(const char *serviceName)
{
    //feature为NULL,则将serviceImpl->defaultApi置为NULL
    return UnregisterFeatureApi(serviceName, NULL);
}

获取默认API接口

//获取服务默认的API接口
static IUnknown *GetDefaultFeatureApi(const char *serviceName)
{
    //第二个参数为NULL,则返回serviceImpl->defaultApi;
    return GetFeatureApi(serviceName, NULL);
}

注册系统能力

//添加系统能力
static int32 AddSystemCapability(const char *sysCap)
{
    //参数检查
    if (sysCap == NULL || strlen(sysCap) == 0 || strlen(sysCap) > MAX_SYSCAP_NAME_LEN) {
        return EC_INVALID;
    }
    //注册系统能力
    return SAMGR_RegisterSystemCapabilityApi(sysCap, TRUE);
}

查询系统能力是否存在

//判断sysCap是否已存在,在注册前进行判断
static BOOL HasSystemCapability(const char *sysCap)
{
    if (sysCap == NULL || strlen(sysCap) == 0 || strlen(sysCap) > MAX_SYSCAP_NAME_LEN) {
        return FALSE;
    }
    //判断sysCap是否已存在
    return SAMGR_QuerySystemCapabilityApi(sysCap);
}

获取已注册的系统能力

//获取可用的系统能力
static int32 GetSystemAvailableCapabilities(char sysCaps[MAX_SYSCAP_NUM][MAX_SYSCAP_NAME_LEN], int32 *sysCapNum)
{
    if (sysCaps == NULL || sysCapNum == NULL) {
        return EC_INVALID;
    }
    //获取所有已注册的syscap的数目存储在size中,并将所有的syscap的name存在sysCaps中
    return SAMGR_GetSystemCapabilitiesApi(sysCaps, sysCapNum);
}

获取API接口

/*
    函数功能:获取API接口
    函数返回:获取成功返回API接口,获取失败返回NULL
    函数描述:获取指定服务下指定功能的API接口。
             若该功能存在,则返回featureImpl的成员iUnknown
             若该功能不存在,则返回服务的默认API接口
*/
static IUnknown *GetFeatureApi(const char *serviceName, const char *feature)
{
    //根据服务名获取samgr中的serviceImpl对象
    ServiceImpl *serviceImpl = GetService(serviceName);
    if (serviceImpl == NULL) {
        //当前进程没有这个服务,需要向其他进程查询
        return SAMGR_FindServiceApi(serviceName, feature);
    }
    //从serviceImpl对象中获取指定featurename的featureImpl对象
    FeatureImpl *featureImpl = DEFAULT_GetFeature(serviceImpl, feature);
    if (featureImpl == NULL && feature == NULL) {
        //featureImpl对象不存在且featurename为NULL
        //返回服务的默认API接口
        return serviceImpl->defaultApi;
    }
    //返回featureImpl的成员iUnknown
    return SAMGR_GetInterface(featureImpl);
}

获取未初始化服务的下标

/*
    函数功能:获取状态为SVC_INIT的服务下标
    函数返回:找到则返回对应的下标,未找到则返回最后一个对象的下一个下标,在这里表现为vector的size值
    函数描述:遍历samgr维护的所有服务,查找状态为SVC_INIT的服务,返回对应的下标
*/
static short GetUninitializedPos()
{
    //获取samgr实例
    SamgrLiteImpl *manager = GetImplement();
    //加锁
    MUTEX_Lock(manager->mutex);
    //获取samgr维护的服务数量
    int16 size = VECTOR_Size(&(manager->services));
    int16 i;
    //遍历所有对象,若有状态为SVC_INIT的,则返回下标
    for (i = 0; i < size; ++i) {
        //根据指定下标获取ServiceImpl对象
        ServiceImpl *service = (ServiceImpl *)VECTOR_At(&(manager->services), i);
        if (service == NULL) {
            continue;
        }
        if (service->inited == SVC_INIT) {
            //解锁,若不进行解锁操作,函数返回会发生死锁现象
            MUTEX_Unlock(manager->mutex);
            return i;
        }
    }
    MUTEX_Unlock(manager->mutex);
    return size;
}

本部分还有许多函数待分析,将在后续的文章进行分析。

总是有很多小伙伴反馈说:OpenHarmony开发不知道学习哪些技术?不知道需要重点掌握哪些OpenHarmony开发知识点? 为了解决大家这些学习烦恼。在这准备了一份很实用的鸿蒙全栈开发学习路线与学习文档给大家用来跟着学习。

针对一些列因素,整理了一套纯血版鸿蒙(HarmonyOS Next)全栈开发技术的学习路线,包含了鸿蒙开发必掌握的核心知识要点,内容有(OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、OpenHarmony驱动开发、系统定制移植……等)技术知识点。

OpenHarmony 开发环境搭建:https://gitcode.com/HarmonyOS_MN/733GH/overview


在这里插入图片描述

《OpenHarmony源码解析》

搭建开发环境
系统架构分析

  • 构建子系统
  • 启动流程
  • 子系统
  • 分布式任务调度子系统
  • 分布式通信子系统
  • 驱动子系统
  • ……

OpenHarmony 设备开发学习手册:https://gitcode.com/HarmonyOS_MN

在这里插入图片描述

鸿蒙开发面试真题(含参考答案):https://gitcode.com/HarmonyOS_MN/733GH/overview

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值