一、前言
本文主要针对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的后续部分将在下一篇中解析。
总是有很多小伙伴反馈说:OpenHarmony开发不知道学习哪些技术?不知道需要重点掌握哪些OpenHarmony开发知识点? 为了解决大家这些学习烦恼。在这准备了一份很实用的鸿蒙全栈开发学习路线与学习文档给大家用来跟着学习。
针对一些列因素,整理了一套纯血版鸿蒙(HarmonyOS Next)全栈开发技术的学习路线,包含了鸿蒙开发必掌握的核心知识要点,内容有(OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、OpenHarmony驱动开发、系统定制移植……等)技术知识点。
OpenHarmony 开发环境搭建:https://gitcode.com/HarmonyOS_MN/733GH/overview
《OpenHarmony源码解析》
搭建开发环境
系统架构分析
- 构建子系统
- 启动流程
- 子系统
- 分布式任务调度子系统
- 分布式通信子系统
- 驱动子系统
- ……