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

100 篇文章 0 订阅
100 篇文章 2 订阅

往期知识点记录:

一、前言

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

二、头文件分析

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

#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实例

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

获取samgrimpl实例

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

初始化系统功能管理器samgr

//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);
}

系统功能管理的启动函数

/*
    函数功能: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);
    }
}

通过id获取服务实例

//根据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获取服务实例

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

写在最后

如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙

  • 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
  • 关注小编,同时可以期待后续文章ing🚀,不定期分享原创知识。
  • 想要获取更多完整鸿蒙最新学习资源,请看下图提示:
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值