往期知识点记录:
- 鸿蒙(HarmonyOS)应用层开发(北向)知识点汇总
- OpenHarmony轻量系统服务管理-samgr主要接口思维导图(1)
- OpenHarmony轻量系统服务管理-samgr主要接口思维导图(2)
- OpenHarmony轻量系统服务管理-samgr:common赏析及实现
- OpenHarmony轻量系统服务管理-samgr:iunknown赏析
- OpenHarmony轻量系统服务管理-samgr:iunknown实现分析
- OpenHarmony轻量系统服务管理samgr-message赏析
- OpenHarmony轻量系统服务管理samgr-message实现分析(1)
- OpenHarmony轻量系统服务管理samgr-message实现分析(2)
- OpenHarmony轻量系统服务管理samgr-service赏析
- OpenHarmony轻量系统服务管理samgr-samgr_lite赏析
- OpenHarmony轻量系统服务管理samgr-feature赏析及实现
- OpenHarmony轻量系统服务管理samgr-service实现分析(1)
- OpenHarmony轻量系统服务管理samgr-service实现分析(2)
- OpenHarmony轻量系统服务管理samgr-task_manager赏析及实现(1)
- OpenHarmony轻量系统服务管理samgr-task_manager赏析及实现(2)
- OpenHarmony轻量系统服务管理|samgr_lite功能详解(一)
- 持续更新中……
一、前言
在samgr_lite
部分,用于向Samgr
注册服务、特性和功能并由Samgr
发现它们。本系列将对samgr_lite_inner.h
和samgr_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🚀,不定期分享原创知识。
- 想要获取更多完整鸿蒙最新学习资源,请看下图提示: