Samgr_lite——如何初始化服务?(完结前篇)


系列博文的倒数第二篇啦,我们看到SAMGR_BootStrap的另一个重要功能函数InitCompleted,它完成了检测服务是否全部初始化完成和系统状态推进的两大功能,下面进入源代码的解读

同样贴上本系列的全部博文让读者能够对整个过程有更清晰的认识:
SA框架下的基于Publish函数的广播机制(从广播机制切入Samgr)(前言)
Samgr_lite——如何注册一个服务?(以广播服务为例)(序章)
Samgr_lite——如何注册一个服务?(以广播服务为例)(正篇)
Samgr_lite——如何注册服务对应的feature?(续章)
Samgr_lite——重要结构体Vector的相关知识
Samgr_lite——如何初始化服务?(终章)
Samgr_lite——如何初始化服务?(大结局前篇)

InitCompleted

首先还是从这个函数的源代码讲起,贴上代码注释:
在这里插入图片描述

基本的函数流程:
1. 调用GetImplement得到g_samgrImpl
2. 调用GetUninitializedPos得到g_samgrImpl中没有初始化的服务在vector的位置pos
3. pos<size时说明存在未初始化的service,返回EC_SUCCESS
4. 若所有的服务都初始化完成,则查看g_samgrImpl的状态:如果是系统服务初始化完成则进入用户APP服务注册和初始化的状态,调用SendBootRequest进行boot请求
5. 如果是用户APP初始化完成,则进入系统DYNAMIC的状态,同样调用SendBootRequest进行boot请求

在函数SAMGR_Bootstrap中注意到最后的判断是:

int32 err = InitCompleted();
    if (err != EC_SUCCESS) {
        HILOG_INFO(HILOG_MODULE_SAMGR, "Goto next boot step return code:%d", err);
    }

也就是说当其返回值等于EC_SUCCESS时,说明本阶段的初始化工作没有完成;不等于EC_SUCCESS,则进行HILOG_INFO告知系统进入下一个boot阶段——在InitCompleted中初始化完成后就可以调用后面的SendBootRequest来进行下一个阶段的boot工作这是相呼应的

而在源代码的解析中我们可以发现SendBootRequest中使用的handler函数竟然也是SAMGR_Bootstrap,构成了一个类似循环但不是循环的结构:
首先外部调用SYS_INIT进行系统服务的注册,然后利用SAMGR_Bootstrap进行服务的初始化,然后在InitCompleted中检测是否全部初始化完毕,完毕则调用SendBootRequest等待用户APP注册完毕后,再次使用(handler)SAMGR_Bootstrap进行用户APP的初始化,再次调用InitCompleted检查是否全部初始化,完毕再次调用SAMGR_Bootstrap直到系统状态变为DYNAMIC平稳运行态后停止

这里其实好像没有看到该函数的出口(可能是这样一直运行检查着有没有新服务的注册和初始化?)有待后续验证


下面是几个出现的重要函数

1. GetUninitializedPos

在这里插入图片描述
函数的流程比较简单:
首先获得g_samgrImpl的实例,然后遍历vector中指针指向的serviceImpl,判断service->inited是否等于SVC_INIT,等于则说明没有初始化返回其在vector的位置;全部不等于则说明全部初始化完成,则返回size

InitCompleted就是调用该函数实现的判断服务是否全部初始化完毕的功能

2. SendBootRequest

在这里插入图片描述
该函数主要是首先调用DEFAULT_GetFeatureId得到bootstrap服务的Identity,然后封装一个request,包含两个传入的参数msgId和msgValue,最后调用SAMGR_SendRequest并传入SAMGR_Bootstrap来完成boot的操作

2.1 DEFAULT_GetFeatureId

在这里插入图片描述
函数名字是获取featureId,其实一定能够得到的serviceId,如果存在taskPool则可以得到对应的queueId,如果传入了对应的featureName则可以得到featureId

2.2 SAMGR_SendRequest

在这里插入图片描述
该函数主要封装了taskPool中使用的exchange结构体,然后调用QUEUE_Put将exchange推送给queueId对应的队列,并且给定handler处理函数供队列调度使用

3. 函数流程图

同样给出函数的流程框图,帮助读者更好的理解其中的逻辑:
在这里插入图片描述

还剩下最后一个重要函数SMAGR_RegisterServiceApi!

欠妥之处,还望批评指正!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

国家一级假勤奋研究牲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值