OpenHarmony模块二下文件samgr_server解析(2)

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值