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可以指向虚函数表,而虚函数表保存了一系列函数的地址。

相关推荐
coder_pig13 小时前
跟🤡杰哥一起学Flutter (三十四、玩转Flutter手势✋)
前端·flutter·harmonyos
simple丶14 小时前
【HarmonyOS】鸿蒙蓝牙连接与通信技术
harmonyos·arkts·arkui
前端世界15 小时前
HarmonyOS开发实战:鸿蒙分布式生态构建与多设备协同发布全流程详解
分布式·华为·harmonyos
Jalor16 小时前
Flutter + 鸿蒙 | Flutter 跳转鸿蒙原生界面
flutter·harmonyos
zhanshuo17 小时前
开发者必看!如何在HarmonyOS中快速调用摄像头功能
harmonyos
HMSCore17 小时前
借助HarmonyOS SDK,《NBA巅峰对决》实现“分钟级启动”到“秒级进场”
harmonyos
zhanshuo17 小时前
鸿蒙UI开发全解:JS与Java双引擎实战指南
前端·javascript·harmonyos
HarmonyOS小助手18 小时前
闯入鸿蒙:浪漫、理想与「草台班子」
harmonyos·鸿蒙·harmonyos next·鸿蒙生态
xq952718 小时前
flutter 鸿蒙化插件开发横空出世
harmonyos
HarmonyOS_SDK18 小时前
借助HarmonyOS SDK,《NBA巅峰对决》实现“分钟级启动”到“秒级进场”
harmonyos