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

一、前言

samgr_lite部分,用于向Samgr注册服务、特性和功能并由Samgr发现它们。本系列将对samgr_lite_inner.hsamgr_lite.c进行分析。相关文件位于distributedschedule_samgr_lite\samgr\source

二、头文件分析

下面的内容是对samgr_lite_inner.h的分析

c 复制代码
#ifndef MAX_SERVICE_NUM
#define MAX_SERVICE_NUM 0x7FF0  //服务的最大个数
#endif
#define DEFAULT_SIZE 1          //用于指定线程个数
#define SINGLE_SIZE 1           //用于指定线程个数
#define MAX_POOL_NUM 8          //任务池的最大个数
#define PROPERTY_STEP 8         //优先级步长
//默认的任务池配置,包括任务优先级、堆栈大小、队列大小、任务类型和共享任务ID
#define DEFAULT_TASK_CFG(pos) {LEVEL_HIGH,  (int16) ((pos) * PROPERTY_STEP + 1), 0x800, 25, SHARED_TASK}
//标识启动状态
typedef enum {
    BOOT_SYS = 0,       //系统级服务启动阶段
    BOOT_SYS_WAIT = 1,  //系统级服务启动完毕后的缓冲阶段
    BOOT_APP = 2,       //应用级服务启动阶段
    BOOT_APP_WAIT = 3,  //应用级服务启动完毕后的缓冲阶段
    BOOT_DYNAMIC = 4,   //动态服务启动阶段
    BOOT_DYNAMIC_WAIT = 5, //动态服务启动完毕后的缓冲阶段
} BootStatus;
typedef struct SamgrLiteImpl SamgrLiteImpl;
struct SamgrLiteImpl {
    SamgrLite vtbl;                      //系统能力管理的类,该类用于注册和发现服务、特性和功能
    MutexId mutex;                       //锁
    BootStatus status;                   //启动状态
    Vector services;                     //服务的集合
    TaskPool *sharedPool[MAX_POOL_NUM];  //任务池
};

三、函数实现分析

当前函数的声明在distributedschedule_samgr_lite\interfaces\kits\samgr\samgr_lite.h中,前文已经进行过赏析。接下来进行函数实现的分析。 获取samgrlite实例

c 复制代码
//获取SamgrLite实例
SamgrLite *SAMGR_GetInstance(void)
{
    //判断g_samgrImpl是否已初始化
    if (g_samgrImpl.mutex == NULL) {
        Init();
    }
    //返回vtbl,一组函数指针
    return &(GetImplement()->vtbl);
}

获取samgrimpl实例

c 复制代码
//获取全局的samgrimpl对象
static SamgrLiteImpl *GetImplement(void)
{
    return &g_samgrImpl;
}

初始化系统功能管理器samgr

c 复制代码
//SA管理器的资源初始化
static void Init(void)
{
    WDT_Start(WDG_SAMGR_INIT_TIME);
    //为SamgrLite类型的成员vtbl的函数指针进行赋值
    //类似于C++中类的虚函数表
    g_samgrImpl.vtbl.RegisterService = RegisterService;
    g_samgrImpl.vtbl.UnregisterService = UnregisterService;
    g_samgrImpl.vtbl.RegisterFeature = RegisterFeature;
    g_samgrImpl.vtbl.UnregisterFeature = UnregisterFeature;
    g_samgrImpl.vtbl.RegisterFeatureApi = RegisterFeatureApi;
    g_samgrImpl.vtbl.UnregisterFeatureApi = UnregisterFeatureApi;
    g_samgrImpl.vtbl.RegisterDefaultFeatureApi = RegisterDefaultFeatureApi;
    g_samgrImpl.vtbl.UnregisterDefaultFeatureApi = UnregisterDefaultFeatureApi;
    g_samgrImpl.vtbl.GetDefaultFeatureApi = GetDefaultFeatureApi;
    g_samgrImpl.vtbl.GetFeatureApi = GetFeatureApi;
    g_samgrImpl.vtbl.AddSystemCapability = AddSystemCapability;
    g_samgrImpl.vtbl.HasSystemCapability = HasSystemCapability;
    g_samgrImpl.vtbl.GetSystemAvailableCapabilities = GetSystemAvailableCapabilities;
    g_samgrImpl.status = BOOT_SYS;//进入启动系统级服务阶段
    //初始化services,vector中存储serviceimpl
    g_samgrImpl.services = VECTOR_Make((VECTOR_Key)GetServiceName, (VECTOR_Compare)strcmp);
    //申请一个已初始化的锁
    g_samgrImpl.mutex = MUTEX_InitValue();
    //初始化任务池
    (void)memset_s(g_samgrImpl.sharedPool, sizeof(TaskPool *) * MAX_POOL_NUM, 0,
                   sizeof(TaskPool *) * MAX_POOL_NUM);
    WDT_Reset(WDG_SVC_REG_TIME);
}

系统功能管理的启动函数

c 复制代码
/*
    函数功能:samgr的启动函数,服务能力管理器启动的入口
    函数描述:判断全局的samgr对象是否初始化,若samgr未初始化则记录日志并返回
             若samgr已初始化,则更新samgr的状态,并初始化所有SVC_INIT状态的service
*/
void SAMGR_Bootstrap(void)
{
    //获取全局的samgrimpl对象
    SamgrLiteImpl *samgr = GetImplement();
    //判断samgr是否初始化
    if (samgr->mutex == NULL) {
        //记录日志
        HILOG_INFO(HILOG_MODULE_SAMGR, "Samgr is not init, no service!");
        return;
    }
    WDT_Reset(WDG_SVC_BOOT_TIME);
    //定义一个Vector,用于存储状态为SVC_INIT的serviceImpl
    Vector initServices = VECTOR_Make(NULL, NULL);
    //加锁
    MUTEX_Lock(samgr->mutex);
    //更新samgr的状态
    samgr->status = TO_NEXT_STATUS(samgr->status);
    //获取vector对象中data的大小,即获取serviceimpl的个数,包括已被释放的元素
    int16 size = VECTOR_Size(&(samgr->services));
    int16 i;
    //遍历samgr->services中所有的ServiceImpl,将状态为SVC_INIT加入到initServices中
    for (i = 0; i < size; ++i) {
        ServiceImpl *serviceImpl = (ServiceImpl *)VECTOR_At(&(samgr->services), i);
        if (serviceImpl == NULL || serviceImpl->inited != SVC_INIT) {
            //参数检查,不满足则跳出本次循环
            continue;
        }
        VECTOR_Add(&initServices, serviceImpl);
    }
    //解锁
    MUTEX_Unlock(samgr->mutex);
    //记录日志
    HILOG_INFO(HILOG_MODULE_SAMGR, BOOT_FMT(samgr->status), VECTOR_Size(&initServices));
    //将所有SVC_INIT状态的serviceImpl进行初始化
    InitializeAllServices(&initServices);
    //释放内存
    VECTOR_Clear(&initServices);
    //判断是否对所有服务都进行了初始化
    int32 err = InitCompleted();
    if (err != EC_SUCCESS) {
        HILOG_INFO(HILOG_MODULE_SAMGR, "Goto next boot step return code:%d", err);
    }
}
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.鸿蒙版性能优化指南
.......

通过id获取服务实例

c 复制代码
//根据serviceId获取serviceImpl对象,serviceId即serviceImpl对象在vector中所在的下标
ServiceImpl *SAMGR_GetServiceByID(int16 serviceId)
{
    SamgrLiteImpl *manager = GetImplement();
    MUTEX_Lock(manager->mutex);
    int16 size = VECTOR_Size(&(manager->services));
    if (serviceId < 0 || serviceId > size) {
        //参数检查
        MUTEX_Unlock(manager->mutex);
        return NULL;
    }
    //根据serviceId获取serviceImpl对象
    ServiceImpl *serviceImpl = (ServiceImpl *)VECTOR_At(&(manager->services), serviceId);
    MUTEX_Unlock(manager->mutex);
    return serviceImpl;
}

通过name获取服务实例

c 复制代码
//根据name获取对应的serviceImpl对象
static ServiceImpl *GetService(const char *name)
{
    if (name == NULL) {
        return NULL;
    }
    //获取samgr对象
    SamgrLiteImpl *manager = GetImplement();
    MUTEX_Lock(manager->mutex);
    Vector *services = &(manager->services);
    //按照name值,在services中查找对应的serviceImpl下标
    short pos = VECTOR_FindByKey(services, (void *)name);
    if (pos < 0) {
        //查找失败
        MUTEX_Unlock(manager->mutex);
        return NULL;
    }
    //根据下标获取对应的serviceImpl
    ServiceImpl *serviceImpl = (ServiceImpl *)VECTOR_At(services, pos);
    MUTEX_Unlock(manager->mutex);
    return serviceImpl;
}

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

四、C++虚函数表解析

虚函数表是C++实现多态的核心。当发生多态时,在类对象中保存一个vptr虚函数指针,位于类对象的起始地址。通过vptr可以指向虚函数表,而虚函数表保存了一系列函数的地址。

相关推荐
二流小码农1 小时前
鸿蒙开发:资讯项目实战之项目框架设计
android·ios·harmonyos
君莫笑111112 小时前
鸿蒙最佳实践之组件动态创建
harmonyos
别说我什么都不会3 小时前
【OpenHarmony】鸿蒙360度的全景渲染:ThreeJs360Demo
harmonyos
Android研究员3 小时前
HarmonyOS实战:List拖拽位置交换的多种实现方式
android·ios·harmonyos
别说我什么都不会5 小时前
【OpenHarmony】 鸿蒙图片加载 ImageViewZoom
harmonyos
云_杰6 小时前
HarmonyOS——ArkTS高性能编程
性能优化·harmonyos
我命由我123458 小时前
嵌入式 STM32 开发问题:烧录 STM32CubeMX 创建的 Keil 程序没有反应
c语言·开发语言·c++·stm32·单片机·嵌入式硬件·嵌入式
elon_z8 小时前
【项目实训#08】HarmonyOS知识图谱前端可视化实现
前端·echarts·知识图谱·harmonyos
Aisanyi9 小时前
【鸿蒙开发从入门到放弃】窗口管理
harmonyos