当前位置:   article > 正文

Samgr_lite——如何初始化服务?(终章)_samgr_bootstrap

samgr_bootstrap

写在前面,经过前面service和feature的一系列讲解,我们来到最后一个环节——通过samgr初始化所有注册的服务

同样先贴上系列文章的链接,方便读者查找相关内容
SA框架下的基于Publish函数的广播机制
Samgr_lite——如何初始化服务?(以广播服务为例)(知识准备)
Samgr_lite——如何初始化服务?(以广播服务为例)(服务的注册)
Samgr_lite——如何初始化服务?(feature的注册)

开始终章!

1. SAMGR_Bootstrap

在注册完系统服务和APP服务后,我们通过SAMGR_Bootstrap函数进行smagr的启动,将所有未初始化的服务进行初始化,使得整个系统进入DYNAMIC平稳运行的状态,那么这个函数实现了什么了,我们将其拆分为几个函数模块来看

1.1 void SAMGR_Bootstrap(void)

首先我们宏观把握这个函数做了哪些事,后面再深入具体函数来看它是如何实现这个功能的
首先贴上代码注释
在这里插入图片描述
函数流程:
1.得到前面创建好的g_samgrImpl并对其进行mutex的检查
2. 创建一个临时的Vector用于保存后面检查出的未初始化的服务
3. 系统对应的BootStatus进入下一个状态
4. 获取互斥锁,开始对共享数据的修改和访问
5. 遍历samgr->services中的每个服务
6. 找到其中所有没有完成初始化的服务将其serviceImpl指针添加到上面的临时Vector中
7. 互斥锁的释放
8. 调用InitializeAllServices将Vector传入,初始化所有服务
9. 调用VECTOR_Clear将临时Vector释放
10. 调用InitCompleted检查是否全部初始化完成
11. 调用HILOG_INFO返回系统状态可以往下一步

注意:函数InitializeAllServices和InitCompleted所做的工作还有很多,包括taskPool的创建,消息处理相关,后面会深入函数进行分析

1.2 SAMGR_Bootstrap函数流程

同样通过图示的方式将流程更加清晰地展现
在这里插入图片描述
限于篇幅原因,在下一篇文章中我们具体讲解函数InitializeAllServices和InitCompleted是如何具体初始化服务的

2. 服务启动三步走的总结

实际工程中的启动过程

首先我们可以注意到源码在service和feature注册init函数下面有这么一行:
在这里插入图片描述
在这里插入图片描述
可以看到这么两行:SYS_SERVICE_INTI和SYS_FEATURE_INIT
其实这才是实际应用中服务和feature注册初始化的启动函数

一个完整的服务的创建和运行需要进行三步走:

  1. 通过SYS_SERVICE_INIT进行服务的注册
  2. 通过SYS_FEATURE_INIT进行feature和featureApi的注册(如果存在feature)
  3. 通过SAMGR_BootStrap函数将服务初始化,分配taskPool并初始化messageHandle

经过以上三步一个服务就真正创建完毕了

而一个完整的系统的创建和运行也是三步走:

  1. 完成所有系统服务和相关feature的注册(包括三个系统服务:BootStrap、Broadcast和hiview)
  2. 完成所有用户自定义的APP服务和相关feature的注册
  3. 通过sendBootRequest启动SMAGR_BootStrap将所有注册但是未初始化启动的服务进行初始化启动

经过以上三步整个系统服务的框架搭建完成

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/227790
推荐阅读
相关标签
  

闽ICP备14008679号