OpenHarmony轻量系统服务管理samgr-feature赏析及实现

本文主要针对feature部分进行分析,这部分代码的分析囊括了interfaces\kits\samgr\feature.h、samgr\source\feature_impl.h和samgr\source\feature.c。

在feature.h中定义了feature的基类,分析如下:

scss 复制代码
struct Feature {
    const char *(*GetName)(Feature *feature);//获取feature名
    //@feature指向当前特性
    //@parent指向特性所属的服务
    //@identity系统调度特性的标识
    //特性初始化,Samgr将任务分派给服务后,该服务在其自己的任务中调用此函数
    void (*OnInitialize)(Feature *feature, Service *parent, Identity identity);
    //停止一个特性
    void (*OnStop)(Feature *feature, Identity identity);
    //处理特性消息,用于处理调用者通过IUnknown发送的请求
    BOOL (*OnMessage)(Feature *feature, Request *request);
};

在feature_impl.h中声明了feature的一些方法,分析如下:

arduino 复制代码
//包含feature和iUnknown的结构体FeatureImpl
struct FeatureImpl {
    Feature *feature;
    IUnknown *iUnknown;
};
//inline--内联函数,在函数调用处展开,可以减少函数调用的开销
//判断指定的Feature是否有效
inline static BOOL IsInvalidFeature(Feature *feature)
{
    return (feature == NULL || feature->GetName == NULL || feature->OnInitialize == NULL ||
            feature->OnMessage == NULL || feature->OnStop == NULL);
}
//判断指定的IUnknown是否有效
inline static BOOL IsInvalidIUnknown(IUnknown *iUnknown)
{
    return (iUnknown == NULL || iUnknown->QueryInterface == NULL || iUnknown->AddRef == NULL ||
            iUnknown->Release == NULL);
}
//添加接口
BOOL SAMGR_AddInterface(FeatureImpl *featureImpl, IUnknown *iUnknown);
//删除接口
IUnknown *SAMGR_DelInterface(FeatureImpl *featureImpl);
//获取接口
IUnknown *SAMGR_GetInterface(FeatureImpl *featureImpl);
//判断featureImpl的接口是否为NULL
BOOL SAMGR_IsNoInterface(FeatureImpl *featureImpl);
//创建FeatureImpl对象
FeatureImpl *FEATURE_CreateInstance(Feature *feature);

在feature.c中对方法进行了实现,分析如下: 添加接口操作

objectivec 复制代码
/*
    函数功能:为featureImpl添加接口
    函数返回:添加成功返回true,添加失败返回false
*/
BOOL SAMGR_AddInterface(FeatureImpl *featureImpl, IUnknown *iUnknown)
{
    //参数检查
    if (featureImpl == NULL || iUnknown == NULL || featureImpl->iUnknown != NULL) {
        return FALSE;
    }
    //将iUnknown添加到featureImpl中
    featureImpl->iUnknown = iUnknown;
    return TRUE;
}

删除接口

arduino 复制代码
/*
    函数功能:删除featureImpl的接口
    函数返回:删除成功返回被删除的对象IUnknown,删除失败返回NULL
    函数描述:删除指定featureImpl的接口,将featureImpl的iUnknown成员赋值为NULL,并返回iUnknown
*/
IUnknown *SAMGR_DelInterface(FeatureImpl *featureImpl)
{
    //参数检查
    if (featureImpl == NULL) {
        return NULL;
    }
    //保存将被删除的iUnknown接口
    IUnknown *iUnknown = featureImpl->iUnknown;
    //置为NULL,删除的作用
    featureImpl->iUnknown = NULL;
    //返回被删除的接口对象
    return iUnknown;
}

DD一下: 欢迎大家关注公众号<程序猿百晓生>,可以了解到一下知识点。

erlang 复制代码
1.OpenHarmony开发基础
2.OpenHarmony北向开发环境搭建
3.鸿蒙南向开发环境的搭建
4.鸿蒙生态应用开发白皮书V2.0 & V3.0
5.鸿蒙开发面试真题(含参考答案) 
6.TypeScript入门学习手册
7.OpenHarmony 经典面试题(含参考答案)
8.OpenHarmony设备开发入门【最新版】
9.沉浸式剖析OpenHarmony源代码
10.系统定制指南
11.【OpenHarmony】Uboot 驱动加载流程
12.OpenHarmony构建系统--GN与子系统、部件、模块详解
13.ohos开机init启动流程
14.鸿蒙版性能优化指南
.......

获取接口

arduino 复制代码
//返回指定featureImpl的成员iUnknown
IUnknown *SAMGR_GetInterface(FeatureImpl *featureImpl)
{
    //参数检查
    if (featureImpl == NULL) {
        return NULL;
    }
    //返回featureImpl的接口
    return featureImpl->iUnknown;
}

判断接口是否存在

objectivec 复制代码
//判断featureImpl的接口是否为NULL,返回true or false
BOOL SAMGR_IsNoInterface(FeatureImpl *featureImpl)
{
    return (BOOL)(featureImpl == NULL || featureImpl->iUnknown == NULL);
}

创建featureimpl实例

ini 复制代码
//为指定的feature创建一个FeatureImpl实例
FeatureImpl *FEATURE_CreateInstance(Feature *feature)
{
    if (feature == NULL) {
        return NULL;
    }
    //分配内存
    FeatureImpl *featureImpl = (FeatureImpl *)SAMGR_Malloc(sizeof(FeatureImpl));
    if (featureImpl == NULL) {
        //内存分配失败
        return NULL;
    }
    //赋值,默认iUnknown为NULL
    featureImpl->feature = feature;
    featureImpl->iUnknown = NULL;
    return featureImpl;
}
相关推荐
不悔哥3 天前
开源OV-Watch:怎么做一个智能手表
单片机·开源·嵌入式
youyin3 天前
HarmonyOS ArkUI 组件与自定义组件零基础:从搭页面到组件化开发
华为·harmonyos
优信电子3 天前
AIT1001 非接触式红外测温模块 STM32 驱动开发实战:从引脚到代码全解析
stm32·嵌入式·温度传感器·红外测温·非接触式测温·ait1001
我爱cope4 天前
【操作系统 | 计算机硬件:CPU、内存与 I/O 如何支撑操作系统?】
学习·操作系统
HwJack204 天前
【HarmonyOS开发小实践】ArkTS 从 TypeScript 到方舟语言的演进
华为·harmonyos
威哥爱编程4 天前
HarmonyOS 7 星盾机密风控实战:设备风险因子端侧融合计算,可用不可见
harmonyos·arkts
youcans_4 天前
【嵌入式软件AI编程】16. Claude Code 与 VS Code 的协同开发
stm32·mcu·嵌入式·ai编程·claude code
威哥爱编程4 天前
HarmonyOS 7 应用快启实战:关键资源预加载进内存,冷启告别白屏
华为·harmonyos·arkts
马剑威(威哥爱编程)4 天前
【共创稿事节】HarmonyOS 7 视觉 AI 进阶实战:人脸检测 + 通用文字识别(OCR)两步接入
华为·harmonyos·arkts