往期知识点记录:
- 鸿蒙(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)
- 持续更新中……
一、前言
本文主要针对service部分进行分析,这部分代码的分析囊括了interfaces\kits\samgr\service.h、samgr\source\service_impl.h和samgr\source\service.c。service.h的代码在service赏析一篇中已经进行过分析。
二、头文件分析
service_impl.h文件分析:
//初始化状态
enum InitStatus {
SVC_INIT = 0, //初始化
SVC_IDLE, //空闲
SVC_BUSY, //繁忙
};
//记录Servcie的信息
typedef struct Operations Operations;
struct Operations {
uint8 abnormal; //异常情况次数
uint8 step; //记录samgr的阶段
uint16 messages; //记录service所处理的消息数量
uint32 timestamp;//处理的最新的一条消息的时间戳
};
//服务的实例对象
typedef struct ServiceImpl ServiceImpl;
struct ServiceImpl {
Service *service;//指定服务
IUnknown *defaultApi;//默认接口
TaskPool *taskPool;//任务池
Vector features;//vector
int16 serviceId;//服务ID
uint8 inited; //服务状态
Operations ops;
};
//判断service是否有效
inline static BOOL IsInvalidService(Service *service)
{
return (service == NULL || service->GetName == NULL || service->Initialize == NULL ||
service->GetTaskConfig == NULL || service->MessageHandle == NULL);
}
//添加Feature
int16 DEFAULT_AddFeature(ServiceImpl *serviceImpl, Feature *feature);
//初始化ServiceImpl
void DEFAULT_Initialize(ServiceImpl *impl);
//消息处理
void DEFAULT_MessageHandle(ServiceImpl *serviceImpl, const Identity *identity, Request *msg);
//停止service
void DEFAULT_StopService(ServiceImpl *service);
//获取FeatureImpl
FeatureImpl *DEFAULT_GetFeature(ServiceImpl *serviceImpl, const char *featureName);
//删除Feature
Feature *DEFAULT_DeleteFeature(ServiceImpl *serviceImpl, const char *featureName);
//获取相应的identity
Identity DEFAULT_GetFeatureId(ServiceImpl *serviceImpl, const char *feature);
//创建ServiceImpl
ServiceImpl *SAMGR_CreateServiceImpl(Service *service, uint8 step);
//根据serviceId获取ServiceImpl对象
ServiceImpl *SAMGR_GetServiceByID(int16 serviceId);
Service实现分析
创建服务实例对象
//根据service和step创建一个ServiceImpl的实例,step:samgr的状态
ServiceImpl *SAMGR_CreateServiceImpl(Service *service, uint8 step)
{
//为ServiceImpl申请内存
ServiceImpl *impl = (ServiceImpl *)SAMGR_Malloc(sizeof(ServiceImpl));
if (impl == NULL) {
//内存分配失败
return NULL;
}
//为ServiceImpl赋初始值
impl->service = service;
impl->defaultApi = NULL;
impl->taskPool = NULL;
/*
GetFeatureName:获取feature的name的函数,作为key值
strcmp:用做比较两个元素大小的函数
*/
//VECTOR_Make创建一个初始的vector对象
impl->features = VECTOR_Make((VECTOR_Key)GetFeatureName, (VECTOR_Compare)strcmp);
impl->serviceId = INVALID_INDEX;//初始值
impl->inited = SVC_INIT;//初始化
impl->ops.abnormal = 0;//异常次数
impl->ops.messages = 0;//处理的消息个数
impl->ops.step = step;//状态阶段
//时间戳,SAMGR_GetProcessTime()返回时间
impl->ops.timestamp = (uint32)SAMGR_GetProcessTime();
return impl;
}
添加服务子功能
/*
函数功能:向服务添加子功能
函数参数:@serviceImpl:服务对象
@feature:待添加的功能
函数返回:添加成功 返回下标,添加失败 返回INVALID_INDEX
函数描述:先判断服务下属的子功能个数是否达到上限,若达到上限则返回INVALID_INDEX
若子功能个数未达上限,则将指定的feature对象封装成FeatureImpl对象,并添加到服务的子功能集合features中
最后返回FeatureImpl对应的下标
*/
int16 DEFAULT_AddFeature(ServiceImpl *serviceImpl, Feature *feature)
{
//参数检查
if (serviceImpl == NULL || feature == NULL) {
return INVALID_INDEX;
}
//判断vector对象features中data实际占用空间,即元素个数 是否超限
if (VECTOR_Num(&(serviceImpl->features)) >= MAX_FEATURE_NUM) {
return INVALID_INDEX;
}
//根据feature创建一个FeatureImpl对象
FeatureImpl *impl = FEATURE_CreateInstance(feature);
if (impl == NULL) {
return INVALID_INDEX;
}
//将impl添加到vector对象的features中
int16 featureId = VECTOR_Add(&(serviceImpl->features), impl);
if (featureId == INVALID_INDEX) {
//若添加失败则释放impl的空间
SAMGR_Free(impl);
}
return featureId;
}
初始化服务实例对象
//初始化ServiceImpl,并初始化ServiceImpl的features中所有的FeatureImpl
void DEFAULT_Initialize(ServiceImpl *impl)
{
//参数检查
if (impl == NULL) {
return;
}
//配置身份标识,包含serviceId,featureId和queueId,消息队列id通过服务绑定的任务池来获取
Identity id = {impl->serviceId, INVALID_INDEX, (impl->taskPool != NULL) ? impl->taskPool->queueId : NULL};
//service初始化
//在Samgr给一个服务分配任务后,该服务在自己的任务中调用Initialize函数
impl->service->Initialize(impl->service, id);
//获取service的name,返回一个常量字符串
const char *serviceName = impl->service->GetName(impl->service);
//注册API
SAMGR_RegisterServiceApi(serviceName, NULL, &id, impl->defaultApi);
//获取features中data的大小
int16 size = VECTOR_Size(&impl->features);
int16 i;
//遍历ServiceImpl的features中所有的FeatureImpl
for (i = 0; i < size; ++i) {
//获取指定下标的FeatureImpl对象
FeatureImpl *feature = (FeatureImpl *)VECTOR_At(&(impl->features), i);
if (feature == NULL) {
continue;
}
//标识当前服务下指定的feature
id.featureId = i;
/*
初始化feature,Samgr将任务分派给服务后,该服务在其自己的任务中调用OnInitialize
@param1:指向当前feature
@param2:指向feature所属的服务
@param3:身份标识
*/
feature->feature->OnInitialize(feature->feature, impl->service, id);
//注册API
SAMGR_RegisterServiceApi(serviceName, feature->feature->GetName(feature->feature), &id, feature->iUnknown);
}
}
对service.c的后续部分将在下一篇中解析。
写在最后
如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
- 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
- 关注小编,同时可以期待后续文章ing🚀,不定期分享原创知识。
- 想要获取更多完整鸿蒙最新学习资源,请看下图提示: