distributedschedule_samgr_lite/samgr_server/source/samgr_server.c
今天继续介绍samgr_server.c下的后续代码
首先是一个samgr服务定义的函数,后续函数在定义时都会用到该函数的各种定义
static SamgrServer g_server = {
.GetName = GetName, //获得函数名
.Initialize = Initialize, //初始化
.GetTaskConfig = GetTaskConfig, //定义服务的任务配置
.MessageHandle = MessageHandle, //处理服务消息
SERVER_IPROXY_IMPL_BEGIN, //定义服务器代理类的默认初始化的开始。
//此宏用于开发服务器代理类,可以继承此宏以减少代码量并防止类定义不一致。
.Invoke = Invoke, //从客户端向IServerProxy发送IPC消息
IPROXY_END,
};
static ProcFunc g_functions[] = { //进程函数
[RES_ENDPOINT] = ProcEndpoint, //进程终端
[RES_FEATURE] = ProcFeature, //进程特征
[RES_SYSCAP] = ProcSysCap, //程序系统上限
};
获取SysCapImpl的名称属性
static const char *GetSysCapName(const SysCapImpl *serviceImpl)
{
if (serviceImpl == NULL) { //若serviceImpl为空,返回空值
return NULL;
}
return serviceImpl->name;
}
登记处初始化
static void InitializeRegistry(void)
{
//初始化客户端注册表
HILOG_INFO(HILOG_MODULE_SAMGR, "Initialize Registry!");
g_server.mtx = MUTEX_InitValue();
SASTORA_Init(&g_server.store);
g_server.samgr = SAMGR_CreateEndpoint("samgr", RegisterSamgrEndpoint);
SAMGR_GetInstance()->RegisterService((Service *)&g_server);
g_server.sysCapMtx = MUTEX_InitValue();
g_server.sysCapabilitys = VECTOR_Make((VECTOR_Key)GetSysCapName, (VECTOR_Compare)strcmp);
ParseSysCap(); //解析系统上限
//初始化注册表ParseSysCap大小
HILOG_INFO(HILOG_MODULE_SAMGR, "InitializeRegistry ParseSysCap size: %d", VECTOR_Size(&(g_server.sysCapabilitys)));
}
SYS_SERVICE_INIT(InitializeRegistry);
接收请求的函数,用于判断请求是否满足接收的要求
static BOOL CanRequest(const void *origin)
{
pid_t uid = GetCallingUid(origin); //获取Uid
return uid < UID_HAP;
}
获取一个服务要素名称
static const char *GetName(Service *service) //feature表示指向该功能的指针
{
//如果操作成功,则返回小于16字节的常量字符串;如果操作失败,则返回NULL。
(void)service;
return SAMGR_SERVICE;
}
初始化服务和身份的功能
static BOOL Initialize(Service *service, Identity identity)
{
SamgrServer *server = (SamgrServer *)service; //调用服务函数
server->identity = identity;
SaName saName = {SAMGR_SERVICE, NULL};
SAMGR_AddRouter(server->samgr, &saName, &server->identity, GET_IUNKNOWN(*server));//添加路由器
return TRUE;
}
处理服务消息
static BOOL MessageHandle(Service *service, Request *request)
{
SamgrServer *server = (SamgrServer *)service;
switch (request->msgId) {
case MSG_CLEAN:
MUTEX_Lock(server->mtx); //互斥锁
SASTORA_ClearByPid(&server->store, request->msgValue); //通过Pid清除
MUTEX_Unlock(server->mtx); //互斥解锁
break;
default:
break;
}
return TRUE;
}
定义服务的任务配置,用于获取任务管理
static TaskConfig GetTaskConfig(Service *service)
{
(void)service;
//不能直接使用PRI_BUTT,因此减1
TaskConfig config = {LEVEL_HIGH, PRI_BUTT - 1, 0x400, 20, SINGLE_TASK};
return config;
}