赞
踩
主要分析service部分代码和service_impl.h相关结构体
文件位置distributedschedule_samgr_lite\samgr\source\service.c
服务实例
//服务的实例对象
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位置满了就不能添加。如果未到上线,就封装为实例添加进服务
参数介绍:
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); } }
剩下部分函数我们下一篇分析。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。