service代码分析
主要分析service部分代码和service_impl.h相关结构体
文件位置distributedschedule_samgr_lite\samgr\source\service.c
头文件注释传送门
service_impl.h相关结构体的支撑
服务实例
//服务的实例对象
typedef struct ServiceImpl ServiceImpl;
struct ServiceImpl {
Service *service;//指定服务
IUnknown *defaultApi;//默认接口
TaskPool *taskPool;//任务池
Vector features;//vector
int16 serviceId;//服务ID
uint8 inited; //服务状态
Operations ops;
};
初始化的状态码
enum InitStatus {
SVC_INIT = 0, //初始化
SVC_IDLE, //空闲
SVC_BUSY, //繁忙
};
Operations用来记录服务的相关信息
这个结构体像是一个监视日志。把服务的一些信息全部记录
typedef struct Operations Operations;
struct Operations {
uint8 abnormal; //异常情况次数
uint8 step; //记录samgr的阶段
uint16 messages; //记录service所处理的消息数量,也是一个任务数量
uint32 timestamp;//处理的最新的一条消息的时间,通过函数getprocesstime实现
};
源代码
添加feature子功能
主要就是添加feature,如果添加成功就返回添加对象feature的id。
函数实现过程中会判断是否有位置可以添加feature,如果下属的feature位置满了就不能添加。如果未到上线,就封装为实例添加进服务
参数介绍:
- serviceImpl:服务对象,一个服务实例。要添加进的母体对象
- feature:需要添加的feature
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
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);
}
}
剩下部分函数我们下一篇分析。